srand 및 rand 기능이 올바르게 사용되지 않습니다. 난수 생성기를 '시드'한 다음 rand()
을 사용하여 RNG에서 연속 값을 검색합니다. 각 시드는 특정 임의성 기준에 맞는 특정 숫자 시퀀스를 생성합니다.
대신, 매번 난수 생성기를 시드 한 다음 임의 순서로 첫 번째 값을 검색합니다. time()
이 너무 빨리 호출되어 동일한 시드를 반환하기 때문에 난수 생성기를 동일한 시퀀스의 시작 부분으로 다시 설정하므로 이전에 얻은 동일한 번호를 얻게됩니다.
time()
에 의해 반환 된 값이 매번 새로운 시드를 얻을 정도로 충분히 빠르게 업데이트 되더라도 좋은 난수는 보장되지 않습니다. 난수 생성기는 시퀀스에 특정 통계적 특성이있는 일련의 숫자를 생성하도록 설계되었습니다. 그러나 동일한 속성이 다른 시퀀스에서 선택한 값보다 길다는 보장은 없습니다.
결정 성 난수 생성기를 사용하려면 생성기를 한 번만 시드 한 다음 해당 한 시드가 생성하는 값 시퀀스를 소비해야합니다.
다른 점; rand()
을 구현하는 데 사용 된 난수 생성기는 역사적으로 매우 좋지 않았습니다. rand()
은 재진입 또는 스레드 안전성이 아니며 rand()
에 의해 생성 된 값을 원하는 분산으로 변환하는 것이 항상 쉬운 것은 아닙니다.
C++의 경우 더 나은 기능을 제공하는 <random>
라이브러리를 선호합니다. 다음은 <random>
을 사용하는 예입니다.
#include <random>
#include <iostream>
int main() {
const int sides = 6;
int groups = 10, dice_per_group = 3;
std::uniform_int_distribution<> distribution(1,sides); // create an object that uses randomness from an external source (provided later) to produces random values in the given (inclusive) range
// create and seed the source of randomness
std::random_device r;
std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()};
std::mt19937 engine(seed);
for (int i=0; i<groups; ++i) {
for (int j=0; j<dice_per_group; ++j) {
// use the distribution with the source of randomness
int r = distribution(engine);
std::cout << "Die #" << j+1 << " rolled a " << r << '\n';
}
std::cout << '\n';
}
}
'rand() % 5'에는 괄호가 필요하지 않습니다. 또한이 표현식은 to에서 4까지의 값을 생성하므로 'die [5]'는 절대 적중하지 않습니다.이러한 종류의 실수를 피하려면 상수를 사용하여 (6과 5를 하드 코딩하는 대신)면의 수를 정의하고 배열 정의에서 해당 상수를 제수로 사용하십시오. –