【问题标题】:picking rand() number from 1-6 [duplicate]从 1-6 中选择 random() 数字 [重复]
【发布时间】:2013-08-09 16:01:16
【问题描述】:

我有一个简单的问题,但不知道如何解决这个问题!我正在尝试创建一个数字生成器,但我只希望它从 1-6 中选择一个随机数。没有零!这个问题被标记为 dup 但不应该是因为这是 C++ 而不是 C

srand(static_cast<unsigned int>(time(0)));
int dice = rand()%6;

【问题讨论】:

  • 只需将 1 添加到 dice
  • 使用rand()/RAND_MAX * (max_n - min_n) + min_n;
  • @GrijeshChauhan - rand()/RAND_MAX 几乎一直为 0;两个表达式都有int 类型,rand() 返回的值永远不会大于RAND_MAX 的值。使用rand()/double(RAND_MAX),或您最喜欢的变体。
  • 将 C++ 问题作为 C 问题的副本来结束有点愚蠢,因为许多 C++ 解决方案不是有效的 C 解决方案,至少找到一个带有正确标签的副本。

标签: c++ random generator


【解决方案1】:

rand() % 6 给出0..5 范围内的数字。加一得到范围1..6

【讨论】:

    【解决方案2】:

    如果 C++11 是一个选项,您还可以使用 std::uniform_int_distribution,它更简单且不易出错(请参阅 rand() Considered Harmful presentationslides):

    #include <iostream>
    #include <random>
    
    int main()
    {
        std::random_device rd;
    
        std::mt19937 e2(rd());
    
        std::uniform_int_distribution<> dist(1, 6);
    
        for( int i = 0 ; i < 10; ++i )
        {
           std::cout << dist(e2) << std::endl ;
        }
    
        return 0 ;
    }
    

    上一个帖子Why do people say there is modulo bias when using a random number generator? 清楚地解释了克里斯在他的评论中指出的模数偏差。

    【讨论】:

    • 而且比rand() 生成器结合模数偏差要好得多。
    • @chris 添加了一个解释模偏差的链接
    【解决方案3】:

    几乎明白了:

    int dice = rand()%6 + 1;

    【讨论】:

    • 太好了,谢谢!
    猜你喜欢
    • 2013-04-20
    • 2019-08-30
    • 2012-03-08
    • 2020-01-02
    • 2014-01-20
    • 2020-10-23
    • 2017-07-10
    • 1970-01-01
    • 2023-02-26
    相关资源
    最近更新 更多