草庐IT

c++ - rand() 真的那么糟糕吗?

灵感来自Generalpurposerandomnumbergeneration我决定执行我自己的测试,看看rand()出了什么问题。使用这个程序:srand(time(0));for(inti=0;i我使用以下命令将其加载到Octave中:S=load("test.txt")hist(S)得到这个结果:对我来说,结果似乎非常统一。我预计结果会更加偏斜。我的测试有误吗? 最佳答案 您问题中的测试并没有真正测试随机性。它所做的只是确保数字均匀分布。这是一个必要条件,但不是充分条件:随机数生成器在许多其他方面可能存在缺陷。例如,如果我给

c++ - 为什么 Mersenne twister 比线性同余生成器更快?

我使用gccC++标准库的Mersennetwister实现进行了测试。它优于线性同余生成器和Crand,后者很可能是LCG。Aboostdocumentation似乎也给出了类似的结果,但更倾向于Mersennetwister。谁能解释一下?#include#include#include#includeclassTimer{private:std::chrono::high_resolution_clock::time_pointstart_time;std::chrono::high_resolution_clock::time_pointstop_time;public:voi

c++ - 用于 C 密码学的快速伪随机数生成器

我使用以下代码生成用于加密目的的伪随机数序列,但后来我在某处读到它可能不是很安全。谁能给我一个更好的生成器的C实现——主要目标是让这种方法更快。例如,我做了一些研究并发现了BlumBlumShub方法,这将通过执行pow(N)计算完全降低性能。附言。并且请不要引用没有C/C++代码的维基百科文章。我正在寻找下面显示的C或C++代码示例。#defineROL(v,shift)((((v)>>((sizeof(v)*8)-(shift)))|((v) 最佳答案 ISAAC(http://www.burtleburtle.net/bob/

c++ - 恒定的正确性和 <random>

处理(否则)包含C++11随机类随机生成器调用的常量函数的正确方法是什么?您应该放弃函数的常量标志还是将生成器和分布声明为类的可变元素会更好?一个最小的例子(不编译)可能是:#includeclassfoo{std::mt19937MyGenerator;std::normal_distributiongauss;doubleget_rnd()const{returngauss(MyGenerator);}}; 最佳答案 这实际上取决于您为const成员访问提供的语义。对于标准类,从多个线程同时调用const成员是线程安全的。保留改

c++ - 在 C++ 中获取均匀分布的随机整数的标准方法是什么?

有没有函数可以获取指定范围内均匀分布的伪随机整数?我可以使用rand编写自己的函数,但这似乎是一种很常见的情况,STL中可能有适合它的东西。 最佳答案 Boost提供了许多随机数生成工具。对于统一分布,你有这个:http://www.boost.org/doc/libs/1_49_0/doc/html/boost/random/uniform_real_distribution.html编辑:更新为包含新的C++11实现。对于整数的情况,这里有引用:http://en.cppreference.com/w/cpp/numeric/r

c++ - 使用 C++ TR1 从二项分布生成数字

我正在尝试使用以下代码(取自互联网)从二项分布生成数字。它编译但挂起一次执行。(我在mac上使用g++。)有人可以建议使用C++TR1库功能从二项分布生成数字的工作代码吗?#include#include#includeusingnamespacestd;usingnamespacestd::tr1;intmain(){std::tr1::mt19937eng;eng.seed(time(NULL));std::tr1::binomial_distributionroll(5,1.0/6.0);std::cout 最佳答案 这是工作

c++ - 什么时候使用 std::random_device?

根据标准,std::random_device按以下方式工作:result_typeoperator()();Returns:Anon-deterministicrandomvalue,uniformlydistributedbetweenmin()andmax(),inclusive.Itisimplementation-definedhowthesevaluesaregenerated.您可以通过多种方式使用它。为引擎播种:std::mt19937eng(std::random_device{}());本身就是一个引擎:std::uniform_int_distributionui

c++ - 为什么这个随机数生成器不是线程安全的?

我正在使用rand()函数生成0,1之间的伪随机数用于模拟目的,但是当我决定让我的C++代码并行运行(通过OpenMP)时,我注意到rand()不是线程安全的,也不是很统一。所以我转而使用(所谓的)更统一的生成器,该生成器出现在其他问题的许多答案中。看起来像这样doublernd(constdouble&min,constdouble&max){staticthread_localmt19937*generator=nullptr;if(!generator)generator=newmt19937(clock()+omp_get_thread_num());uniform_real_

c++ - std::default_random_engine 生成介于 0.0 和 1.0 之间的值

我希望能够生成介于0.0和1.0之间的随机值我试过std::default_random_enginegenerator;std::uniform_real_distributiondistribution(0.0,1.0);floatmyrand=distribution(generator);在循环中生成随机值总是给我这些值:0.0000220.0850320.6013530.8916110.9679560.1896900.5149760.3980080.2629060.7435120.089548我该怎么做才能真正获得随机值?如果我总是得到相同的,那似乎不是随机的。

c++ - 我应该在 C++ 应用程序中多久调用一次 srand()?

我有一个在不同地方调用rand()的C++应用程序。我是否需要定期初始化srand()以确保rand()相当随机,或者在应用程序启动时调用一次就足够了吗? 最佳答案 如果您只有一个线程,请播种一次。如果您经常重新播种,您实际上可能会破坏随机数的某些统计特性。如果你有多个线程,根本不要使用rand,而是像drand48_r这样的线程安全的东西,它可以让你保持每个线程的状态(这样你就可以播种一次每个线程)。 关于c++-我应该在C++应用程序中多久调用一次srand()?,我们在StackO