문제는 추가입니다. 값을 rand()
반환합니다 . 따라서 두 개를 추가하면에 도달 할 수 있습니다. 이 초과 하면 추가 결과가 보유 할 수 있는 유효 범위를 초과합니다 . 부호있는 값의 오버플로는 정의되지 않은 동작이며 키보드가 외국 언어로 대화 할 수 있습니다.int
0...RAND_MAX
RAND_MAX * 2
INT_MAX
int
여기에 두 개의 임의 결과를 추가 할 때 얻는 이점이 없으므로 간단한 아이디어는 그렇게하지 않는 것입니다. 또는 unsigned int
합계를 보유 할 수있는 경우 각 결과를 더하기 전에 캐스트 할 수 있습니다 . 또는 더 큰 유형을 사용하십시오. 참고 long
보다 반드시 더 넓은 int
동일한가 적용되는 long long
경우에 int
적어도 64 비트이다!
결론 : 추가를 피하십시오. 더 많은 "무작위"를 제공하지 않습니다. 더 많은 비트가 필요하면 값을 연결할 수도 sum = a + b * (RAND_MAX + 1)
있지만보다 큰 데이터 유형이 필요할 수도 있습니다 int
.
명시된 이유는 제로 결과를 피하는 것입니다. 두 rand()
통화가 모두 0 일 수 있으므로 두 호출 의 결과를 추가하여 피할 수는 없습니다 . 대신 증분 할 수 있습니다. 경우 RAND_MAX == INT_MAX
,이은으로 수행 할 수 없습니다 int
. 그러나 (unsigned int)rand() + 1
매우 가능성이 높습니다. UINT_MAX > INT_MAX
필자가 알고있는 모든 구현에서 사실 이기 때문에 (최종적으로 아님) 가능성이 높습니다 ( 지난 30 년 동안 임베디드 아키텍처, DSP 및 모든 데스크탑, 모바일 및 서버 플랫폼을 포함합니다).
경고:
이미 여기 의견에 뿌려 있지만,이 개 임의의 값을 추가하면 않는하시기 바랍니다 참고 하지 얻을 : 균일 한 분포를 얻을 수 있지만, 두 개의 주사위를 압연 같은 삼각 분포는 12
두 주사위 보여주고있다 (두 개의 주사위) 6
. 를 위해 11
: 거기에 이미 두 가지 변종이다 6 + 5
또는 5 + 6
등,
따라서이 측면에서도 추가가 나쁩니다.
또한 의사 난수 생성기에rand()
의해 생성되므로 결과 생성은 서로 독립적이지 않습니다 . 또한 표준은 계산 된 값의 품질 또는 균일 분포를 지정하지 않습니다.
rand()
부정적인 수 없습니다 ...