2017-12-07 3 views
0
私はスウィフト4.ここ

スウィフトへのJava Math.randomを変換する4

int randomNoteIndex = myArray[0] + (int) (Math.random() * (myArray[1] - myArray[0] + 1)); 

に以下のJavaコードを変換することができますどのように私が試したが、私はいつもmyarrayの[0]毎回同じ番号を得るものです思っていた

let randomNoteIndex = myArray[0] + Int(arc4random_uniform(1) * (UInt32(myArray[1]) - UInt32(myArray[0]) + UInt32(1))) 
+1

コードを盲目的に変換する前に、実際にAPIが行っていることを調べる必要があります。 [there](https://stackoverflow.com/questions/24132399/how-does-one-make-random-number-between-range-for-arc4random-uniform)を参照してください。 –

+0

リンク@M.Prokhorovのおかげでそれは明確なことを助けました – james

答えて

0

lowerBound + (int) (Math.random() * (upperBound - lowerBound + 1))は、範囲が[lowerBound, upperBound]の一様分布の乱数を返します。

arc4random_uniform(upperBound)は、upperBound未満の一様分布の乱数を返します。したがって、あなたはする必要があります求めているもの:ヤコブが述べたように

lowerBound + arc4random_uniform(upperBound - lowerBound + 1) 

は、arc4random_uniform(myArray.count)範囲内のランダムな「インデックス」、ではない数を返します。おそらく彼はあなたの変数の命名からこれを推測しました。

+0

私はあなたの答えを受け入れました。しかし、ヤコブの答えは、私が問題を理解するのを助けました。私はあなたの答えを使い、それを働かせることができました。 – james

0

arc4random_uniformは、0と引数-1との間でランダムな値を返します。したがって、あなたが1を渡すと、あなたは0を得ることができます。

必要な動作は、配列数を渡すことで実現できます。たとえば:

let randomIndex = Int(arc4random_uniform(Int32(myArray.count)))

注キャスト、これはarc4random_uniformはCが派生であるため、その明示的な型を必要としています。

関連する問題