【问题标题】:How to get uniformally distributed random number? [closed]如何获得均匀分布的随机数? [关闭]
【发布时间】:2014-03-02 13:35:18
【问题描述】:

我正在尝试在 for 循环中生成三个随机数:

for (i=0; i<100; i++)
{
  item1 = rand()/(double)RAND_MAX*100;
  item2 = rand()/(double)RAND_MAX*200;
  item3 = rand()/(double)RAND_MAX*300;
}

所以我的问题是:

如何为每个 item1、2 和 3 获取等距随机数

如 item1 = 10,20,30,40,50 item2 = 40, 60, 80, item3 = 25,35,45 等

【问题讨论】:

  • 如果它们是等距的,那么它们不是随机的。也许你可以把你的意思说清楚。
  • 用户猜对了。
  • 您知道您的问题很糟糕吗?您应该对其进行编辑以明确您的意思。

标签: c++ random numbers distributed


【解决方案1】:

您只想对随机数进行舍入,或在生成后对其进行缩放/投影。

这是……乘法。示例:(Live On Coliru)

#include <random>
#include <iostream>

int main()
{
    std::mt19937 engine(time(NULL));
    std::uniform_int_distribution<int> dist(0,10); // arbitrary range chosen

    for (int i=30; i>0; --i)
    {
        int random = dist(engine);
        std::cout << (random*10) << "\t" << (random*20) << "\t" << (random*10 + 15) << "\n";
    }
}

输出:

90  180 105
30  60  45
90  180 105
50  100 65
70  140 85
10  20  25
40  80  55
30  60  45
80  160 95
60  120 75
0   0   15
40  80  55
20  40  35
20  40  35
90  180 105
50  100 65
80  160 95
0   0   15
0   0   15
0   0   15
40  80  55
50  100 65
10  20  25
60  120 75
100 200 115
80  160 95
70  140 85
90  180 105
30  60  45
60  120 75

【讨论】:

  • 感谢您的回复。我无法使用您正在使用的库。我的 gnu g++ 不支持它。但是,在我的代码中,我无法像您一样获得确切的 10,20 等数字。您是否认为我的代码有一些更改,以便我可以使用 gnu g++ 编译器。非常感谢您的宝贵时间。
  • 知道了。使用 g++ -std=c++11 选项,您的代码正在运行。你拯救了我的一天。非常感谢。
  • 请注意,为了演示,我将不同输出的范围限制为 11 个值 (0..10)。这可能不适合你。更改dist 上的边界参数以进行调整:)
【解决方案2】:

你想要的数字根本不是随机的,事实上这是序列

你可以这样做

int sequence =5;
int initial=10;

For (i=0; i<100; i++)
{
item1 = initial;
initial=initial+sequence;
item2 = initial;
initial=initial+sequence;
item3 = initial;
initial=initial+sequence;
}

它将生成 10、15、20、...

【讨论】:

    【解决方案3】:

    也许您正在尝试获取随机等间距序列的初始随机数,如下所示:

    for (i=0; i<100; i++)
    {
        if(i == 0)
        {
            item1 = rand()/(double)RAND_MAX*100;
            item2 = rand()/(double)RAND_MAX*200;
            item3 = rand()/(double)RAND_MAX*300;
    
            increment1 = rand()/(double)RAND_MAX*100;
            increment2 = rand()/(double)RAND_MAX*200;
            increment3 = rand()/(double)RAND_MAX*300;
        }
        else
        {
            item1 += increment1;
            item2 += increment2;
            item3 += increment3;
        }
    
        //do stuff
    }
    

    【讨论】:

    • 我想将数字保持在 1 到 100 之间。
    • 哪个数字、项目或增量?您还需要保持增量固定吗?
    猜你喜欢
    • 2021-05-26
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多