2017-12-31 192 views
2

C에서 임의의 정수 값을 만드는 방법은 무엇입니까? 동전이 튀는 것처럼 행동해야합니다. 여기 내가 무엇을 시도했다입니다 : 당신의 솔루션을코인 뒤집기를 위해 c에서 임의의 int 값을 만드는 방법

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

int main(void) 
{ 
    int i; 

    srand(time(NULL)); 

    for (i=0; i<10; i++) 
     if ((int)(((float) rand()/((float) SHRT_MAX)) * 2) > 0) 
      puts("etz"); 
     else 
      puts("pali"); 
    return EXIT_SUCCESS; 
} 
+1

내 취향에 너무 복잡합니다. 당신은 단지'if (rand() % 2)'를 할 수 있습니다. – HolyBlackCat

+0

표시된 중복은 실제로 중복이 아닙니다. 그 질문은 공정한 동전이 아니라 동전에 관한 것입니다. – Clifford

+0

@HolyBlackCat 불쌍한 아이디어 - 게시 된 답변을 참조하십시오. –

답변

4

문제는 표현 (int)(((float) rand()/((float) SHRT_MAX)) * 2) > 0 항상 shortint이 동일한 너비 플랫폼에서 제외한 사실 때문에 rand()는 항상 양의 정수를 반환합니다.

또 다른 문제가 rand()는 0에서 RAND_MAX하지 SHRT_MAX에 값을 반환 - 그것은 현대 라이브러리의 가능성이 그 RAND_MAX == SHRT_MAX

솔루션에 따라서 적용 할 수 있습니다

(float)rand()/RAND_MAX > 0.5f 

하지만 주조 및 부동 소수점 비교는 불필요하며 복잡한 작업을 통해 다음과 같이 테스트 할 수 있습니다.

rand() > RAND_MAX/2 

심지어으로/당신은 그냥 이상한 테스트 수 있다고 제안 될 가능성이 :

rand() % 2 == 0 

하지만이의 임의성에 의존하기 때문에 그 어떤 잘못 구현 알고리즘에 문제가 하나의 LSB - 그것은 가능성이 높습니다 현대 라이브러리에서 작업하지만 코드 이식성을 보장하는 것이 가장 좋습니다.