2015-01-13 2 views
0

2 개의 임의의 정수를 만드는 무작위 방법이 있습니다. 내 우려는 출력의 % 65- % 70은 "5-5", "4-4", "3-3"과 같은 정수입니다.arc4random을 사용하는 더 나은 방법

-(void)random{ 
NSUInteger randomNumber = arc4random_uniform(5); 

    switch (randomNumber) { 
     case 0: 
      _tile2.image = [UIImage imageNamed:@"one.png"]; 
      break; 

     case 1: 
      _tile2.image = [UIImage imageNamed:@"two.png"]; 
      break; 

     case 2: 
      _tile2.image = [UIImage imageNamed:@"three.png"]; 
      break; 

     case 3: 
      _tile2.image = [UIImage imageNamed:@"four.png"]; 
      break; 

     case 4: 
      _tile2.image = [UIImage imageNamed:@"five.png"]; 
      break; 
    } 

    NSUInteger randomNumber2 = arc4random_uniform(5); 

    switch (randomNumber2) { 
     case 0: 
      _tile3.image = [UIImage imageNamed:@"one.png"]; 
      break; 

     case 1: 
      _tile3.image = [UIImage imageNamed:@"two.png"]; 
      break; 

     case 2: 
      _tile3.image = [UIImage imageNamed:@"three.png"]; 
      break; 

     case 3: 
      _tile3.image = [UIImage imageNamed:@"four.png"]; 
      break; 

     case 4: 
      _tile3.image = [UIImage imageNamed:@"five.png"]; 
      break; 
    } 
} 

더 나은 결과를 얻으려면 25 가지 사례를 만들어야합니까?

NSUInteger randomNumber = arc4random_uniform(25); 

    switch (randomNumber) { 
     case 0: 
      _tile2.image = [UIImage imageNamed:@"one.png"]; 
      _tile3.image = [UIImage imageNamed:@"one.png"]; 
      break; 

     case 1: 
      _tile2.image = [UIImage imageNamed:@"one.png"]; 
      _tile3.image = [UIImage imageNamed:@"two.png"]; 
      break; 

     case 2: 
      _tile2.image = [UIImage imageNamed:@"one.png"]; 
      _tile3.image = [UIImage imageNamed:@"three.png"]; 
      break; 

     case 3: 
      _tile2.image = [UIImage imageNamed:@"one.png"]; 
      _tile3.image = [UIImage imageNamed:@"four.png"]; 
      break; 

     case 4: 
      _tile2.image = [UIImage imageNamed:@"one.png"]; 
      _tile3.image = [UIImage imageNamed:@"five.png"]; 
      break; 

     case 5: 
      _tile2.image = [UIImage imageNamed:@"two.png"]; 
      _tile3.image = [UIImage imageNamed:@"one.png"]; 
      break; 

     ... 
    } 
} 

arc4random_uniform은 임의의 정수를 가져 오는 데 유용합니다. 2 개 이상의 임의의 숫자를 가져올 필요가있을 때 그 결과는 그렇게 좋지 않습니다. 이 일을하는 가장 좋은 방법은 무엇입니까?

+0

큰 배치에서 '동일한 정수'의 비율을 65-70 %로 계산 했습니까? 두 가지 방법을 모두 사용하여 ± 20 % 여야합니다. 두 번째 방법으로 25 가지 경우를 만들 필요는 없으므로 'randomNumber/5'를 사용하여 첫 번째 숫자를 추출하고'randomNumber % 5'를 사용하여 두 번째 숫자를 추출한 다음 첫 번째 방법과 동일하게 계속 진행할 수 있습니다. – Aaganrmu

+0

@Aaganrmu 예. 1000 개의 숫자가있는 첫 번째 무작위 방법의 출력을 확인했습니다. 결과는 65-70 %라고 말한 것과 같습니다. 두 번째 방법의 목적은 동일한 숫자를 얻을 확률을 줄이는 것입니다. 그러나 3 개 이상의 난수를 얻으려면이 방법으로 재앙이 발생합니다. – Taha

+1

난 그냥 같은 테스트를 실행하고 예상대로 20 % 만 동일했다. – ahwulf

답변

0

숫자 배열을 사용하면 해결 방법이 될까요? 방금 ​​발견 한 수를 삭제 [4 @ 3 @, @ 2, 1 @, @ 0] 숫자`의 변경 가능한 배열을 가지고 임의의 인덱스

NSMutableArray *array = [NSMutableArray arrayWithObjects:@0, @1, @2, @3, @4]; 
NSInteger firstIndex = arc4random_uniform([array count]); 
NSNumber *firstNumber = array[index]; 

에서 하나 개의 번호를 검색 할 수 있습니다 :

[array removeObjectAtIndex:firstIndex]; 

두 번째 숫자에 대해 동일하게 반복하십시오. 검색된 첫 번째 숫자는 배열에 더 이상 포함되지 않으므로 arc4random_uniform()이 동일한 값 (65-70 %의 경우)을 제공하더라도 스위치 케이스에서 사용할 실제 숫자는 달라집니다.

이 접근법은 아마도 조금 어색하지만 아마도 난독성에 대해 약간의 제어권을 제공해야한다고 생각합니다.

1

죄송하지만, 저는 당신을 믿지 않습니다. 당신은 보여준 것과 다른 것을해야합니다.

import Cocoa 

let sampleSize = 1000 
var count = 0 
for i in 1...sampleSize { 
    var randomNumber1 = arc4random_uniform(5) 
    var randomNumber2 = arc4random_uniform(5) 
    if randomNumber1 == randomNumber2 { 
    ++count 
    } 
} 
println(Double(count)/Double(sampleSize)) 

무엇이든 문제는 데있어, 그것은 arc4random_uniform 값 쌍을 생성하는 방법으로되지 않습니다 : 놀이터에 붙여 다음 코드는 지속적으로 20 % 일치하지 당신이 주장하는 65~70% 주위에 제공합니다.