2017-12-07 1 views
0
내가 스위프트 4. 여기에

스위프트 자바 인 Math.random 변환 4

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

에 아래의 자바 코드를 변환 할 수 있습니다 내가 어떻게 시도하지만 난 항상에서 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를 유도하기 때문에 그렇게 명시 적으로 입력이 필요합니다.