【问题标题】:Random number generator without repeating numbers无重复数字的随机数生成器
【发布时间】:2014-03-11 18:13:33
【问题描述】:

我正在尝试创建一个不重复数字 {0 - 7} 的随机数生成器。

我在这里遇到了一个段错误错误,我很确定我在那里正确分配了所有内存。我发现偶尔可行的一种解决方案是,如果我将 shuffledbracket 参数大小设置为 9。但是,由于它有一个额外的内存,它会放入一个额外的 0。关于如何让我的数组只有参数大小为 8 的任何想法段错误错误?

【问题讨论】:

    标签: c++ arrays random segmentation-fault


    【解决方案1】:

    C++ 中的数组从 0 开始。因此,您的 for 循环无效。而不是:

    for (int i = 8; i > 0; i--)
    

    应该是

    for (int i = 7; i >= 0; i--)
    

    除此之外,显然没有hehe 变量。

    【讨论】:

    • 当然它会返回一个浮点异常错误——最后一次迭代会做rand()%0。你必须改变那条线。
    • 知道了,我刚做了 rand()%(i+1)。
    【解决方案2】:

    8 不是shuffledbracket 的有效索引,C++ 数组的索引为0 to N-1,在本例中为0 to 7,因此您需要修改循环:

    for (int i = 7; i >= 0; i--)
               ^^^    ^^^
    

    这引入了另一个问题,因为0 的模数是undefined behavior:

    randnumero = rand()%i;
                       ^^
    

    如果你想从[M,N] 生成一个随机数,你可以使用C FAQ entry How can I get random integers in a certain range? 中的这个公式:

    M + rand() / (RAND_MAX / (N - M + 1) + 1)
    

    或者您可以使用random header 和uniform_int_distribution:

    std::uniform_int_distribution<int> dist(0, i);
    

    【讨论】:

    • 正如他所解释的,模数为零是未定义的行为。
    • 只是为了仔细检查我在上面发布的内容是否也有效?
    • @user3298889 它应该可以正常工作,但为了将来参考,上述方法更好。
    猜你喜欢
    • 1970-01-01
    • 2015-06-22
    • 2018-06-25
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    相关资源
    最近更新 更多