[objective-c] Objective-C에서 난수 생성

나는 주로 Java 헤드이고 0에서 74 사이의 의사 난수를 생성하는 방법을 원합니다. Java에서는 다음 방법을 사용합니다.

Random.nextInt(74)

나는 씨앗이나 진정한 무작위성에 대한 토론에 관심이 없으며 Objective-C에서 동일한 작업을 수행하는 방법에 대해서만 이야기합니다. Google을 sc이 뒤졌으며, 상이하고 상충되는 정보가 많이있는 것 같습니다.



답변

arc4random_uniform()기능을 사용해야합니다 . 에 우수한 알고리즘을 사용합니다 rand. 씨앗을 설정할 필요조차 없습니다.

#include <stdlib.h>
// ...
// ...
int r = arc4random_uniform(74);

arc4random매뉴얼 페이지

NAME
     arc4random, arc4random_stir, arc4random_addrandom -- arc4 random number generator

LIBRARY
     Standard C Library (libc, -lc)

SYNOPSIS
     #include <stdlib.h>

     u_int32_t
     arc4random(void);

     void
     arc4random_stir(void);

     void
     arc4random_addrandom(unsigned char *dat, int datlen);

DESCRIPTION
     The arc4random() function uses the key stream generator employed by the arc4 cipher, which uses 8*8 8
     bit S-Boxes.  The S-Boxes can be in about (2**1700) states.  The arc4random() function returns pseudo-
     random numbers in the range of 0 to (2**32)-1, and therefore has twice the range of rand(3) and
     random(3).

     The arc4random_stir() function reads data from /dev/urandom and uses it to permute the S-Boxes via
     arc4random_addrandom().

     There is no need to call arc4random_stir() before using arc4random(), since arc4random() automatically
     initializes itself.

EXAMPLES
     The following produces a drop-in replacement for the traditional rand() and random() functions using
     arc4random():

           #define foo4random() (arc4random() % ((unsigned)RAND_MAX + 1))

답변

arc4random_uniform(upper_bound)함수를 사용하여 범위 내에서 난수를 생성 하십시오 . 다음은 0에서 73 사이의 숫자를 생성합니다.

arc4random_uniform(74)

arc4random_uniform(upper_bound)매뉴얼 페이지에 설명 된대로 모듈로 바이어스 를 방지 합니다.

arc4random_uniform ()은 upper_bound보다 작은 균일하게 분포 된 난수를 반환합니다. arc4random_uniform ()은“arc4random () % upper_bound ”와 같은 구성보다 권장 됩니다. 상한이 2의 거듭 제곱이 아닌 경우 ” 모듈러스 바이어스 “를 피하기 때문입니다.


답변

C와 똑같이

#include <time.h>
#include <stdlib.h>
...
srand(time(NULL));
int r = rand() % 74;

(0을 포함하지만 74는 제외한다고 가정하면 Java 예제와 동일합니다)

편집 : Feel로 대체 할 무료 random()arc4random()에 대한 rand()(다른 사람들이 지적으로,이다, 매우 짜증나).


답변

많은 프로젝트에서 사용하는 방법을 추가 할 수 있다고 생각했습니다.

- (NSInteger)randomValueBetween:(NSInteger)min and:(NSInteger)max {
    return (NSInteger)(min + arc4random_uniform(max - min + 1));
}

많은 파일에서 사용하면 일반적으로 매크로를 다음과 같이 선언합니다.

#define RAND_FROM_TO(min, max) (min + arc4random_uniform(max - min + 1))

예 :

NSInteger myInteger = RAND_FROM_TO(0, 74) // 0, 1, 2,..., 73, 74

참고 : iOS 4.3 / OS X v10.7 (Lion) 이상에만 해당


답변

이것은 0에서 47 사이 의 부동 소수점 숫자를 제공합니다

float low_bound = 0;
float high_bound = 47;
float rndValue = (((float)arc4random()/0x100000000)*(high_bound-low_bound)+low_bound);

아니면 그냥

float rndValue = (((float)arc4random()/0x100000000)*47);

하한과 상한도 모두 음수 일 수 있습니다 . 아래 예제 코드는 -35.76과 +12.09 사이의 난수를 제공합니다.

float low_bound = -35.76;
float high_bound = 12.09;
float rndValue = (((float)arc4random()/0x100000000)*(high_bound-low_bound)+low_bound);

결과를 더 둥근 정수 값으로 변환하십시오 .

int intRndValue = (int)(rndValue + 0.5);


답변

rand (3) 매뉴얼 페이지에 따르면 rand 함수 계열은 random (3)에 의해 폐기되었습니다. 이는 rand ()의 하위 12 비트가 주기적 패턴을 거치기 때문입니다. 난수를 얻으려면 부호없는 시드로 srandom ()을 호출 한 다음 random ()을 호출하여 생성기를 시드하십시오. 따라서 위 코드와 동등한 것은

#import <stdlib.h>
#import <time.h>

srandom(time(NULL));
random() % 74;

시드를 변경하지 않는 한 프로그램에서 srandom ()을 한 번만 호출하면됩니다. 당신이 정말로 임의의 값에 대한 토론을 원하지 않는다고 말했지만, rand ()는 꽤 나쁜 난수 생성기이며 random ()은 여전히 ​​0에서 RAND_MAX 사이의 숫자를 생성하기 때문에 모듈로 바이어스로 고통받습니다. 예를 들어, RAND_MAX가 3이고 0과 2 사이의 임의의 숫자를 원하는 경우 1 또는 2보다 0을 얻을 가능성이 두 배입니다.


답변

사용하는 것이 좋습니다 arc4random_uniform. 그러나 iOS 4.3 이하에서는 사용할 수 없습니다. 운 좋게 iOS는 컴파일 타임이 아닌 런타임에이 심볼을 바인딩합니다 (따라서 #if 프리 프로세서 지시문을 사용하여 사용 가능한지 확인하지 마십시오).

arc4random_uniform사용 가능한지 확인하는 가장 좋은 방법 은 다음과 같은 작업을 수행하는 것입니다.

#include <stdlib.h>

int r = 0;
if (arc4random_uniform != NULL)
    r = arc4random_uniform (74);
else
    r = (arc4random() % 74);