【问题标题】:Generating two ( or multiple) uniformly distributed random numbers c++ [duplicate]生成两个(或多个)均匀分布的随机数c ++ [重复]
【发布时间】:2015-09-25 06:00:29
【问题描述】:

我想在同一次传递中生成多个均匀分布的随机数。 到目前为止,我有一个用于生成随机数的“标准”函数

double generateRandomNumber()
{
    srand((unsigned)time(NULL));
    double r=((double)rand()/(double)RAND_MAX);
    return r;
}

我怎么在 main 中这样称呼它:

# include <iostream>
# include <string>
# include <cmath>
# include <ctime>

int main()
{

    // generate random number
    double rr1=generateRandomNumber();
    double rr2=generateRandomNumber();
    cout << rr1 << endl;
    cout << rr2 << endl;
    return 0;
}

我知道这两个数字是相同的(我猜这是秒的时间限制),无论如何,这是我想将其概括为多个随机数。

谁能提出更好的方法?也许使用不同的方法或库?

【问题讨论】:

标签: c++ random


【解决方案1】:

在使用rand 之前,不要每次都调用srand
srand 应该在程序开始时只调用一次。

您可以使用静态变量查看之前是否调用过srand

double generateRandomNumber()
{
    static bool initialized = false;
    if (!initialized)
    {
        srand((unsigned)time(NULL));
        initialized = true;
    }
    double r=((double)rand()/(double)RAND_MAX);
    return r;
}

【讨论】:

  • @MikeCAT 为什么每次进入函数都要声明静态变量,不应该声明一次吗?
  • 嗯,如果有多个随机数生成函数,例如int generateRandomInteger(),我可以说这是个坏主意。在 main 函数的开头调用 srand 或在需要时使用调用 srand 的程序包装 rand() 更好。
  • static 函数中的变量仅在程序开始时初始化一次。第一次调用这个函数:initialized = falsesrand被调用,initlaized变成true。第二次调用或更晚:initlaized 仍然是 true,所以这里没有调用 srand
  • 我认为让函数作为生成器的种子是个坏主意。这会产生不希望的耦合。例如,调用者不能播种来重现特定序列。每次都测试initialized 也很浪费。我强烈建议将种子要求放在调用者身上。
  • @jarhead 删除与initialized 相关的所有内容,而是在main 中只调用一次srand。您是否阅读了我在 cmets 中针对该问题提供的链接?
猜你喜欢
  • 2016-05-09
  • 1970-01-01
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 1970-01-01
  • 2021-12-28
  • 2014-08-16
  • 1970-01-01
相关资源
最近更新 更多