【问题标题】:using uniform_real_distribution in C++在 C++ 中使用 uniform_real_distribution
【发布时间】:2013-09-05 12:24:45
【问题描述】:

我正在尝试在 C++ 中使用 uniform_real_distribution 来生成随机数数组。这是我的代码

#include <random>
#include <iostream>
#include <vector>
using namespace std;

int main()
{
    int max_index = 48655;
    vector<int> arr;
    arr.resize(100);

    std::random_device radm;
    std::mt19937_64 mt(radm());
    std::uniform_real_distribution<> distribution(0, max_index);

    for(int i = 0; i < 100; i++)
    {
        arr[i] = int(distribution(mt)*(max_index-1))%(max_index-1);
    }
    return 0
}

问题是,虽然我已经明确指定随机数在0max_index 内是均匀分布的,但我的数组中仍然存在一些负数。并且它们的值是相同的(-2432)

我可以知道我错了吗?

非常感谢。

编辑1:

================================================ =====================

恐怕很多回复者都在为乘法和模运算而苦恼。这是一个错误,我已经删除了它。 但关键是,即使这会在语义上影响结果,也不能让生成器给出否定的结果。

【问题讨论】:

  • 您确定您正确验证了向量的内容吗?看起来您的代码不可能在具有 32 位 int 的系统上产生负数(我认为这就是您所拥有的。)顺便说一句,乘法和模数的用途是什么?
  • 最重要的问题是为什么要对循环中的值进行乘法和取模?您需要的值范围是多少?为什么不在分布中指定它并完成它?
  • @Blastfurnace 那是个错误。我删除了它,因为我不再需要控制范围。无论如何,重点是为什么会有负值?

标签: c++ random


【解决方案1】:

因为(max_index-1)**2 = 2367211716 &gt; 2**31 - 1。任何大于 44136 的值在乘以 max_index-1 时都会导致有符号整数溢出。这大约是您生成的随机数的 9%。

在模运算之后使用 long 进行算术以避免这种情况。

【讨论】:

    【解决方案2】:

    全部

    感谢您的回答。我真的很感激。

    现在,我对我的代码做了一些改动,如下所示

    ind[i] = abs(int(distribution(mt)));
    

    在这种情况下,不再出现负值。

    但是,问题仍未得到解答:为什么第 1 篇文章中有负面影响?

    【讨论】:

    • 你真的需要腹肌吗?
    • 在循环中你可以打印distribution(mt) if (int)(distribution(mt)*(max_index-1))
    • 尝试:double myValue = distribution(mt); if ((int(myValue*(max_index-1))%(max_index-1) )
    猜你喜欢
    • 1970-01-01
    • 2015-02-06
    • 2020-02-05
    • 2018-03-28
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多