2014-10-22 3 views
0

C/C++에서 난수를 만드는 효율적인 방법은 rand() 함수입니다. 그러나 임의의 변수를 생성하기 위해 다음과 같은 코드를 보았습니다 :난수를 만드는 또 다른 방법

int x; x%=100; 

간단한 난수를 생성하는 좋은 방법입니까? 당신의 대답이 '아니오'라면, 이유를 말해주십시오.

는 편집 : 잘 실제 코드는 여기에 있습니다 : 내

int temp1,temp2; 
A=(abs(temp1))%11-1; 
B=(abs(temp2))%11-1; //Randomize without using rand() 

친구가이 코드를 썼다. 내가 컴파일하려고했는데 uninitialized local variable 'temp1' used 오류가 발생했습니다 (MSVS에서). 그는 2011 년에이 코드를 작성했으며 최신 버전의 GCC를 사용하여 Linux에서 작업했습니다.

+9

이것은 끔찍한 일입니다. 그것은 이전 사용에 의해 남겨진 모든 가비지 값에 의존하며, 디버그 모드에서 항상 0 일 수 있습니다 (일부 디버거 0은 int를 초기화 함). 즉, 'rand()도 끔찍하다'(http://channel9.msdn.com/Events/GoingNative/2013/rand-Considered-Harmful)라고합니다. 그냥''을 사용하십시오. – Borgleader

+0

최적화가 설정된 루프의 값을 인쇄 해보는 것이 어떨까요? –

+2

C 런타임은 프로그램을 실행하기 전에 모든 초기화되지 않은 메모리에 대기 잡음에 의한 난수를 채 웁니다. 아니면 아닐 수도 있습니다. –

답변

5

더 나쁜 것을 보는 것은 드문 일입니다.

초기화되지 않은 변수를 사용하는 것처럼 정의되지 않은 동작이 있습니다.

그리고 계수를 사용하면 통계적 편차가 생깁니다.

4

친구가 초기화되지 않은 변수를 잘못 이해했습니다. 그들로부터 읽어 잠시 무시

정의되지 않은이며 그들이 안전하게 당신이 임의무작위을 의미하지 않는다는 것을 기억해야 다음 임의의 값을 얻을 것입니다 척 경우에 따라서, 단지 아무것도 할 수.

이 접근법은 최소값과 사이에 있으며 값이 임의로 분포하는 사이에 있습니다. 그래서 당신은 당신이 돌아 오는 것을 예측할 수는 없겠지만, 그것은 의미있는 의미에서 "무작위"로 유용하게 만들지는 못합니다.

또한 %을 배포하면 파손되기 때문에 그렇게하지 마십시오.

편집 설정에서 경고를 켜도록 친구에게 말하십시오. 그의 GCC는 그에게이 모든 것을 말하려고 시도하지만 그는 듣고 있지 않습니다.

+0

입니다. – Chantola

관련 문제