2012-04-12 3 views
0

가능한 중복 :
why do i always get the same sequence of random numbers with rand()?동일한 임의 값을 계속 가져 오는 이유는 무엇입니까?

내가 전에 (심지어 (동일한 컴퓨터에서) 다른 프로그램를 사용하여이/실행 컴파일하고 vaues을 nilling 후하는 사실에 의해 혼동하고 있는데 이후) 함수가 .. 그게 무슨 상관이야. 나는 매번 같은 "무작위"숫자를 얻을 것이다. 내가 TextMate를에 ...이 .. 나는 단순히 가능한 한 설명하기 위해거야 일을 해야하는 방법이 아니다

#import <Foundation/Foundation.h> 
int main(int argc, char *argv[]) { 

    int rPrimitive = 0; rPrimitive = 1 + rand() % 50; 
    NSNumber *rObject = nil; rObject = [NSNumber numberWithInt:rand() % 10]; 
    NSLog(@"%i %@", rPrimitive, rObject); 

    rPrimitive = 0; rObject = nil; 
    NSLog(@"%i %@", rPrimitive, rObject); 
    return 0;   
} 

실행을 맹세 : CodeRunner에서

i686-apple-darwin11-llvm-gcc-4.2 
8 9 
0 (null) 

실행을 :

i686-apple-darwin11-llvm-gcc-4.2 
8 9 
0 (null) 

원하는 경우 백만 번 실행하십시오. 당신은 그것이 항상 무엇인지 추측 할 수 있습니다. 왜 이런 일이 생길까요? 왜 이런 이유가 "어떻게"인가?

+0

내 질문은 실제로 이러한 결과가 OS/메모리의 논리적 분할을 가로 질러 확장된다는 사실과 "rand"자체보다는 null에 값을 할당 했음에도 불구하고 발생한다는 사실이 더 많았습니다. –

+2

@alexgray 이것은 다른 OS가 동일한 PRNG를 사용한다는 것을 의미합니다. 이는 예상치 못한 일이 아닙니다.널 (NULL)을 설정해도 메모리 버그가 아닌'rand'의 예상되는 동작이므로 아무 것도 변경하지 않습니다. –

+0

자동 생성 된 중복 링크를 제거하지 마십시오. 운영자의주의를 끌기 위해이 질문을 표시하거나, 다시 열어야한다고 생각되면 [Meta.SE]에서 문제를 제기 할 수 있습니다. –

답변

6

이 왜합니다 (rand 사람 페이지에서)입니다 :

If no seed value is provided, the rand() function is automatically 
    seeded with a value of 1. 

가 항상 항상 숫자의 동일한 시퀀스를 생성합니다 같은 수의 씨앗을 품고 있기 때문에. 실행될 때마다 다른 시퀀스를 생성하게하려면 실행될 때마다 다른 시드를 사용해야합니다. srand()을 사용하여 시드를 설정할 수 있습니다.

+2

일반적인 패턴은'srand (time (NULL))'이므로 프로그램의 연속적인 실행은 다른 씨앗을 얻는다. –

3

숫자가 임의이 아니므로 pseudorandom입니다. 동일한 초기 시드가 주어지면 항상 동일한 출력을 생성하는 알고리즘에 따라 생성됩니다. PRNG를 시드하지 않으므로 기본값 인 상수 시드를 사용합니다.

예측할 수없는 (예 : 현재 시간 및/또는 PID와 같은) 것을 사용하여 PRNG를 시드하면 매번 다른 결과가 나옵니다. rand(3)의 경우 srand(3)으로 시드해야합니다. rand 그것은 (실제로 할 수있는 매우 어려운 일이다) 진정한 난수를 생성하지 않는 의미, 의사 난수 발생기 때문에

2

가 그렇게 인 이유입니다. 그것은 “ 시드 ”을 사용하여 시퀀스에서 다음 번호를 생성하고 실행 시작시 시드가 항상 동일한 값 (1 정도)으로 설정되므로 시드를 변경하지 않으면 항상 얻을 수 있습니다. 동일한 난수의 시퀀스. srand(time(NULL));과 같은 것을 사용하여 시간에 따라 난수 생성기를 시드하거나 암호화 목적으로 충분하다고 생각되는 난수 생성기 arc4random을 사용할 수 있습니다.

당신이 할 수있는 것 “ 왜 이렇게됩니까? ”이지만 동일한 일련의 “ 임의의 숫자 ”을 여러 번 생성하려는 경우가 있습니다.

+0

아, 맞아, 나는 이전에 arc4random을 사용했었다. 그래서 이것이 이상하게 보였다. 실제로 우주에 주된 감각을주기 전에'#define rand() (arc4random() % ((unsigned) RAND_MAX + 1))' , 다시. 감사. –

+1

결정 론적 기계 (컴퓨터라고도 함)에서는 진정한 난수 생성은 어렵지 않고 불가능합니다. 무작위의 외부 소스가 필요합니다. –

+0

@alexgray 이것을 수행해도 여전히 의사 난수를 사용하고 있습니다. arc4random이 상수 값 '1'보다 더 고유 한 것으로 씨름합니다. – tobyodavies

관련 문제