c - 如何在c中为硬币翻转生成一个随机int值

标签 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;
}

最佳答案

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

另一个问题是 rand() 返回一个从零到 RAND_MAX 的值,而不是 SHRT_MAX - 在现代库中不太可能RAND_MAX == SHRT_MAX

您的解决方案可能会这样调整:

(float)rand() / RAND_MAX > 0.5f

但是转换和浮点比较是不必要的,而且过于复杂,可以这样测试:

rand() > RAND_MAX / 2 

可能会建议您可以使用以下方法来测试奇数/偶数:

rand() % 2 == 0 

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

关于c - 如何在c中为硬币翻转生成一个随机int值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48045250/

相关文章:

c - c中相同代码的不同答案

c - 在c中使用strncpy时出现段错误

c - signal() 返回类型

c++ - 传递给函数的 Default_random_engine 提供可重复的结果

python - 单位球体表面区域上的点的随机样本

javascript - 随机选择组合,以便每个元素精确地代表两次

c++ - 我正在尝试创建一个程序,该程序根据用户输入的最大值来乘以随机数

algorithm - 将数字表示为 0..maxSummand 中 N 个数字的均匀随机总和

c - 选择排序字符 C

c - strtok。如何完成解析