게임을 실행할 때마다 출력되는 임의의 숫자가 동일한 순서로 출력됩니다. 왜 이런 일이 일어나는 걸까요?프로그램을 실행할 때마다 동일한 난수가 표시됩니다.
나는
#include <cstdlib>
이 있고 난수를 생성하기 위해 사용하고
당신은 당신의 난수 생성기 시드 할 필요가randomDiceRollComputer = 1 + rand() % 6;
게임을 실행할 때마다 출력되는 임의의 숫자가 동일한 순서로 출력됩니다. 왜 이런 일이 일어나는 걸까요?프로그램을 실행할 때마다 동일한 난수가 표시됩니다.
나는
#include <cstdlib>
이 있고 난수를 생성하기 위해 사용하고
당신은 당신의 난수 생성기 시드 할 필요가randomDiceRollComputer = 1 + rand() % 6;
:
가의 시작 부분이 퍼팅 시도를 프로그램 :
srand (time(NULL));
#include <ctime>
이 필요합니다.
아이디어는 프로그램을 실행할 때마다 RNG에 다른 번호를 지정하는 것입니다. 시간을 시드로 사용하면 프로그램을 시작할 때마다 다른 번호를 얻게됩니다.
랜덤 넘버 생성기에 시드를 제공해야합니다. 이것은 현재의 시간을 취함으로써 이루어질 수 있습니다. 이것은 희망적으로 어떤 종류의 무작위적인 것입니다.
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
int r;
srand(time(0));
r = rand();
return 0;
}
의사 난수 생성기는 시작 번호 또는 시드를 취한 다음이 순서에서 다음 번호를 생성합니다. 이것이 그들이 pseudorandom이라 불리는 이유입니다. 왜냐하면 그들은 항상 같은 시작 값을 사용하기 때문에 C 표준 lib 생성기와 같은 일련의 숫자를 생성하기 때문입니다. 발전기에 다음에 프로그램이 현재 시간과 같이 실행될 때 변경되는 시작 값을 제공하면이 문제를 해결할 수 있습니다.
어쨌든, 당신이 말한과 같은 다른 찾고있는 코드는 다음과 같습니다 주어진 씨앗을 파종 할 때 rand()
기능은 특히 숫자의 동일한 시퀀스를 생성하는 데 필요한
srand(time(0)); //Seed the generator, give it a starting value
아니, 그들은 ' 의사 랜덤 (pseudorandom)이라고 불리는 이유는 수학적 의미에서 랜덤하지 않기 때문입니다. 실행될 때마다 고유 번호를 생성하는 PRNG는 여전히 의사 난수입니다. –
@KeithThompson 알다시피, 나는 그것이 PRNG의 특정 유형이 PRNG 인 이유입니다. 보다 일반적으로 PRNG는 의사 결정 알고리즘을 사용하여 시퀀스의 각 값을 찾아 내기 때문에 의사 난수라고합니다. – jgon
(srand()
를 호출하여) ; 가능한 각 시드 값은 시퀀스를 지정합니다. srand()
으로 절대 전화하지 않으면 rand()
을 호출하기 전에 srand(1)
으로 전화하여 동일한 시퀀스를 얻습니다.
이 테스트 목적으로 유용 할 수 있습니다. 예를 들어, 프로그램에 버그가있는 경우 동일한 시드로 다시 실행하여 코드를 재현 할 수 있습니다. 다른 예측할 수없는 동작을 제외하면 동일한 일련의 의사 난수를 얻을 수 있습니다.
더 많거나 적은 예측할 수없는 의사 난수를 얻으려면 보통 srand(time(NULL))
을 호출하는 것이 좋습니다. 하지만 완벽하지는 않습니다. 같은 초에 프로그램이 두 번 실행되면 time()
(일반적으로)의 해상도가 1 초이므로 동일한 순서를 얻게됩니다. 그리고 전형적인`rand() 구현체는 이 아니고 암호화 용도로 사용할 수있는이 아닙니다. 공격자가 당신이 얻고 자하는 숫자를 쉽게 추측 할 수 있습니다.
다른 난수 구현이 많이 있습니다. Linux 시스템에는 두 개의 의사 장치 인 /dev/random
과 /dev/urandom
이 있으며,이 장치를 통해 비교적 높은 품질의 의사 임의 바이트 값을 읽을 수 있습니다.일부 시스템은 random()
, drand48()
등과 같은 기능을 가질 수 있습니다. 그리고 수많은 알고리즘이 있습니다. Mersenne Twister에 대한 좋은 소식을 들었습니다.
게임처럼, 속이려고하는 플레이어를 기대하거나 신경 쓰지 않는 곳이면 srand(time(NULL))
및 rand()
으로 충분할 것입니다. 더 진지한 목적을 위해, 당신은 내가하는 것보다이 물건에 대해 더 많이 알고있는 누군가로부터 조언을 얻어야합니다.
comp.lang.c FAQ의 13 절에는 의사 난수 생성에 관한 몇 가지 매우 유용한 정보가 있습니다.
http://en.wikipedia.org/wiki/Pseudorandom_number_generator – DuckMaestro