C++ 在C++;?

C++ 在C++;?,c++,random,numbers,C++,Random,Numbers,生成随机数的最佳方法是什么?是生成伪随机数(或真正随机数,如果平台支持的话)的优秀库。您应该使用: #包括 类型定义标准::mt19937 rng_类型; 标准:统一内部分布udist(0,7); rng_型rng; int main() { //种子rng优先: rng_type::result_type const seedval=get_seed();//从某处获取 种子(种子); rng类型::结果类型随机数=udist(rng); 返回随机数; } C++前11,你可以在Tr1(

生成随机数的最佳方法是什么?

是生成伪随机数(或真正随机数,如果平台支持的话)的优秀库。

您应该使用

#包括
类型定义标准::mt19937 rng_类型;
标准:统一内部分布udist(0,7);
rng_型rng;
int main()
{
//种子rng优先:
rng_type::result_type const seedval=get_seed();//从某处获取
种子(种子);
rng类型::结果类型随机数=udist(rng);
返回随机数;
}

C++前11,你可以在Tr1(<代码> <代码> >,代码> STD::Tr1::MT1937 等)中找到,或者在Boost.random,基本上是相同的接口(虽然有细微的差别)。

< P>如果你在谈论标准C++库前C++ 11,RAND和SRand是你的随机数生成器。与使用整数算术的模相比,有一些方法可以从这些函数中获得更高的精度。例如,如果不关心高速,可以使用double,并将结果四舍五入为int

至于定制库,如果你真的想要好的随机分布和速度,谷歌MersenneTwister。boost中还有一些选项

有了C++11,您就有了

当且仅当:
  • 你不是在寻找“完美的一致性”或
  • 您没有C++11支持,甚至没有TR1(因此您没有其他选择)

< > > 您可以考虑使用以下C样式解决方案(为了这个社区的信誉,请参见): 下面是一个简单的C型函数,它从

min
max
的区间(含)生成随机数。这些数字似乎非常接近于均匀分布

在使用之前,不要忘记调用
srand

int出现次数[8]={0};
srand(时间(0));
对于(int i=0;i<100000;++i)
++发生[伊朗(1,7)];

对于(inti=1;i我的'random'库提供了一个非常方便的C++11随机类包装器

示例:

  • 范围内的随机数
  • auto val=Random::get(-10,10);//Integer

    auto val=Random::get(10.f,-10.f);//浮点值

  • 随机布尔
  • auto val=Random::get()//0.5%生成true

    auto val=Random::get(0.7)//0.7%生成true

  • std::initilizer\u列表中的随机值
  • 迭代器范围或所有容器中的随机迭代器
  • auto-it=Random::get(vec.begin(),vec.end());//it=Random迭代器

    autoit=Random::get(vec);//返回随机迭代器

    还有更多内容!请查看github页面:


    为什么
    rand
    不好用?因为你应该用除法、加号和…来把数字放在两个数字之间!一定要有beterfunctions@DavidSchwartz我来这里是因为兰德公司每次都会产生相同的结果…@TomášZato,所以显示出出现问题的代码,并询问如何解决它。我检查了他们的文档,只是为了make确定他们没有声称自己能产生真正的随机数,事实并非如此。那么,你为什么要在回答中包含这一点呢?@KevinCrowell它包括
    random\u设备
    (现在的标准标题也是如此),以便在拥有此类设备的平台上访问非确定性统一随机数生成器。(例如,操作系统通过观察网络流量等方式收集随机数据,并通过/dev/random提供对该数据的访问)我认为发行版的返回类型和引擎的返回类型之间不需要有关联。我通常喜欢将发行版和引擎绑定在一起,除非我有特殊原因需要将它们分开。此外,引擎可以将种子放入构造函数中,因此您可以将其全部放在一行:
    auto rand=bind(均匀分布(0,7),mt19937(get_seed())
    @bames53:你说得对,分布和引擎的整体类型可能会有所不同。就个人而言,我不太喜欢免费的
    bind
    s,但当然,如果你想要更紧凑的形式,那就去吧。但是我怎样才能得到足够的随机种子呢?@TomášZato:你可以使用
    std::random_设备
    结果取决于您的实现,但这只是一个开始。您的
    irand
    实现不会产生均匀分布的随机数:如演讲中所述,某些值比其他值更可能出现。您的示例在7:30处进行了描述。@syam:我已经多次看到此演讲的链接,但尚未注意最后,我看了它,并对我的答案进行了适当的编辑:)公平地说,演讲者认为您的实现只是“微妙地”不一致,而不是其他“滑稽地”不一致的解决方案。例如,我在
    rand()
    中犯了更严重的错误……)@syam:但是如果有可用的
    ,为什么不去做呢?这是一个更干净、更好的解决方案。它也可以包装成一个独立的助手函数,比如my
    irand
    。别误会,我不是在提倡使用你的实现而不是
    ,只是指出还有更糟糕的错误要犯。当然
    如果可用,应该优先考虑,但是如果您必须使用
    rand()
    ,那么您的解决方案可能是(其中一个?)我们能得到的最佳解决方案。
    #include <random>
    
    typedef std::mt19937 rng_type;
    std::uniform_int_distribution<rng_type::result_type> udist(0, 7);
    
    rng_type rng;
    
    int main()
    {
      // seed rng first:
      rng_type::result_type const seedval = get_seed(); // get this from somewhere
      rng.seed(seedval);
    
      rng_type::result_type random_number = udist(rng);
    
      return random_number;
    }
    
    int irand(int min, int max) {
        return ((double)rand() / ((double)RAND_MAX + 1.0)) * (max - min + 1) + min;
    }
    
    int occurences[8] = {0};
    
    srand(time(0));
    for (int i = 0; i < 100000; ++i)
        ++occurences[irand(1,7)];
    
    for (int i = 1; i <= 7; ++i)
        printf("%d ", occurences[i]);
    
    auto val = Random::get( { 1, 3, 5, 7, 9 } ); // val = 1 or 3 or...