如何在c中制作随机int值以进行硬币翻转

时间:2017-12-31 19:42:45

标签: c random

如何在C中创建随机整数值? 我需要它像硬币翻转一样。 这是我尝试过的:

#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 个答案:

答案 0 :(得分:4)

您的解决方案的问题是(int)(((float) rand() / ((float) SHRT_MAX)) * 2) > 0始终返回正整数,因此除shortint宽度相同的平台外,表达式rand()始终为真。

另一个问题是,RAND_MAX会将值从零返回到SHRT_MAX而不是RAND_MAX == SHRT_MAX - 在(float)rand() / RAND_MAX > 0.5f

的现代库中不太可能

您的解决方案可能因此得到改进:

rand() > RAND_MAX / 2 

但是铸造和浮点比较是不必要的,而且过于复杂,因此可以进行测试:

rand() % 2 == 0 

可能有人建议您只需测试奇数/偶数:

TIME_TO_SEC

但这在一些执行不佳的算法中存在问题,因为它依赖于单个LSB的随机性 - 它可能在现代库中工作,但最好避免以确保代码可移植性。