【问题标题】:how to make a random int value in c for coin flipping如何在c中制作随机int值以进行硬币翻转
【发布时间】:2018-06-11 05:33:03
【问题描述】:

如何在 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;
}

【问题讨论】:

  • 对我来说太复杂了。你可以做if (rand() % 2)
  • 标记的复制品并不是真正的复制品 - 这个问题是关于偏向硬币,而不是公平硬币。
  • @HolyBlackCat 糟糕的想法 - 请参阅发布的答案。
  • 不要在 Stack Overflow 上使用 [Tab]。它不会正确格式化您的帖子。请改用 4 空格缩进。

标签: c random


【解决方案1】:

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

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

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

(float)rand() / RAND_MAX > 0.5f

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

rand() > RAND_MAX / 2 

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

rand() % 2 == 0 

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

【讨论】:

    猜你喜欢
    • 2020-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    相关资源
    最近更新 更多