2014-04-17 3 views
-1

1에서 3 사이의 난수는 어떻게 생성합니까? 내가 얻을이 기능으로 때때로 0 (난 단지 싶어 1, 2가 또는 3) :1에서 3 사이의 임의의 숫자

ziehen=rand() % 3 + 1; 

을 내가 메인 프로그램에서 (0)부터 srand를 추가해야 할 이유는 무엇입니까?

#include <stdlib.h> 
#include <stdio.h> 
#include <time.h> 

을 음울에 추가했습니다. 이것으로 충분합니까, 아니면 더 필요합니까?

+3

_'or 내가 더 필요? '_ 작동합니까 구현에 의존입니까? –

+0

아, 좋은 오래된 기술. http://ericlippert.com/2013/12/16/how-much-bias-is-introduced-by-the-remainder-technique/ – harold

+0

rand()의 결과 사본을 가져 와서 사용하십시오. 계산 ziehen. ziehen이 0 일 때 값을 인쇄하십시오. 어떤 값들이 당신에게 0을 주는지 보는 것은 흥미로울 것입니다. – cup

답변

1

이 코드는 0을 반환 할 수 없습니다. rand()는 항상 0과 RAND_MAX 사이의 숫자를 반환합니다.

모듈로 연산은 0과 2 사이의 값을 반환합니다. 1을 추가하면 원하는 결과가 나타납니다. 괄호를 사용할 필요가 없습니다. 모듈러스는 덧셈보다 순위가 높습니다.

srand (0)을 추가 할 필요는 없지만 그렇게 할 경우 항상 동일한 일련의 번호를 갖게됩니다. 문서를 읽으십시오.

+0

기술적으로 "모듈러스 연산"이라고하는 것을 "나머지"라고합니다. 그리고 -2와 2 사이의 값을 반환합니다 (힌트). –

+1

그러나 0과 RAND_MAX 사이의 값만 있습니다. 이것이 어떻게 부정적 일 수 있습니까? – xMRi

+0

네, OP가 어떻게 관리했는지 궁금합니다. OP는 stdlib.h가 포함되어있어'rand()'의 프로토 타입을 제공해야한다고합니다 - 빠진 프로토 타입은 내가 생각하고있는 방법 중 하나였습니다 –

2

절대 입력하지 않음rand()의 출력주기를 줄이려면 계수를 사용하십시오. 이유? 표준 선형 합동 생성기의 하위 비트가 상위 비트보다 덜 랜덤하기 때문입니다. 모듈은 상위 비트를 무시합니다.

가장 좋은 방법은 (3.0 * rand()/(RAND_MAX + 1.0)) + 1.0;입니다. 출력을 정수 형식에 할당하여 암시 적으로이 값을 int으로 캐스팅합니다.

RAND_MAX 는 C 표준에 의해 정의되며, 그 값은

+0

흠, 그리고 이것은'[0; 3]'을 반환 할 것인가? –

+0

넵, 암시 적으로'(int) '로 캐스팅되면 1, 2 또는 3을 반환합니다. 조금 더 자세하게 수정했습니다. – Bathsheba

+2

좀 더 좋을 수도 있고 종종 해결책으로 주어질 수도 있지만 어느 쪽도 정확하지 않습니다. http://www.azillionmonkeys.com/qed/random.html – harold

관련 문제