草庐IT

c++ - 生成伪随机 16 位整数

我需要生成16位伪随机整数,我想知道最佳选择是什么。我想到的明显方法如下:std::random_devicerd;autoseed_data=std::array{};std::generate(std::begin(seed_data),std::end(seed_data),std::ref(rd));std::seed_seqseq(std::begin(seed_data),std::end(seed_data));std::mt19937generator(seq);std::uniform_int_distributiondis(std::numeric_limits::

c++ - 优化 C++11 随机生成器的使用

我正在大量使用随机数编写物理模拟代码,我只是第一次分析我的代码,所以我在读取输出时可能有误,但我看到这一行排在第一位:%cumulativeselfselftotaltimesecondssecondscallsms/callms/callname90.0921.8821.882655360.080.08std::mersenne_twister_engine::operator()()这似乎意味着生成数字生成器花费了90%的时间。我之前已经写过一篇文章询问是否在每个循环中不构建随机概率分布可以节省我的时间但是在尝试和计时之后它没有帮助(Isdefiningaprobabilitydi

c++ - std::uniform_real_distribution 包含范围

C++11std::uniform_real_distribution(-1,1)给出[-1,1]范围内的数字。如何获得[-1,1]范围内的均匀实数分布?实际上这可能无关紧要,但从逻辑上讲,我正在尝试选择包含范围内的值。 最佳答案 如果您从查看整数开始,就更容易思考这一点。如果你传递[-1,1)你会期望得到-1,0。由于您想要包含1,因此您将传递[-1,(1+1)),或[-1,2)。现在你得到-1,0,1。你想做同样的事情,但是用double:借自thisanswer:#include//DBL_MAX#include//std::

c++ - random_shuffle 不是真正随机的

我在像这样的vector上使用random_shuffle:#includevectordeck;//somecodetoaddcardstothedeckhererandom_shuffle(deck.begin(),deck.end());运行的时候deck的内容是乱码的,但是重启程序后还是保留了这个乱码。我错过了什么吗?我怎样才能让它真正随机? 最佳答案 您需要先使用srand为伪随机数生成器播种.#include#include...std::srand(std::time(0));vectordeck;//somecode

c++ - 比时间 (0) 更好的种子?

我知道time(0)通常用于播种随机数生成器,并且只有当程序每秒运行一次以上时它才会成为问题。我想知道在生成随机数时需要考虑哪些更好的种子。我阅读了Windows上的GetTickCount、timeGetTime和QueryPerformanceCounter。这些是否足以满足几乎所有操作,还是有更好的播种选项?这是一个使用boost库的快速代码示例:#include#includeusingnamespacestd;usingnamespaceboost;intmain(){mt19937randGen(42);uniform_intrange(0,100);variate_gen

c++ - 如何生成海量高质量的随机数?

我正在研究在晶格中移动的粒子的随机游走模拟。出于这个原因,我必须创建大量随机数,大约10^12及以上。目前我正在使用C++11提供的可能性.在分析我的程序时,我发现大部分时间花在了上。.这些数字中的绝大多数都在0到1之间,分布均匀。然后我需要一个二项分布的数字。但重点在于0..1数字。问题是:我可以做些什么来减少生成这些数字所需的CPU时间,这会对它们的质量产生什么影响?如您所见,我尝试了不同的引擎,但这对CPU时间没有太大影响。此外,我的uniform01(gen)之间有什么区别?和generate_canonical::digits>(gen)无论如何?编辑:通读答案后我得出结论,

c++ - C++11 提供了哪个 Mersenne Twister?

我无法确定MersenneTwisterC++11提供的变体。在Mersennetwister:A623DimensionallyEquidistributedUniformPseudorandomNumberGenerator查看Matsumoto和NishimuraACM论文,作者提供了算法,算法的实现,并称之为MT19937。但是,当我用下面的小程序测试C++11的同名生成器时,我无法重现Matsumoto和Nishimura的MT19937创建的流。流与产生的第一个32位字不同。C++11提供了哪些MersenneTwister?下面的程序使用GCC、-std=c++11和GN

c++ - 快速生成随机集,蒙特卡洛模拟

我有一组数字~100,我希望对这组数字进行MC模拟,基本思想是我完全随机化该组,对前20个值进行一些比较/检查,存储结果并重复。现在实际的比较/检查算法非常快,它实际上在大约50个CPU周期内完成。考虑到这一点,为了优化这些模拟,我需要尽快生成随机集。目前我正在使用GeorgeMarsaglia的MultiplyWithCarry算法,它在17个CPU周期内为我提供一个随机整数,速度非常快。但是,使用Fisher-Yates洗牌算法我必须生成100个随机整数,约1700个CPU周期。这大大超过了我的比较时间。所以我的问题是是否有其他众所周知/强大的技术来进行这种类型的MC模拟,从而避免

c++ - 伪随机数生成器给出相同的第一个输出,但随后按预期运行

使用随机类和时间种子(NULL),均匀分布始终给出相同的第一个输出,即使使用不同的编译,但在第一个输出之后的行为与您期望的伪随机数生成器的行为相同。这是构造出来的,还是我使用不当?MWE:#include#include#includeusingnamespacestd;default_random_enginegen(time(NULL));uniform_int_distributiondist(10,200);intmain(){for(inti=0;i我运行这个程序的前三次得到的输出是:57134125136112在第二次尝试之前,我决定删除uniform_int_distri

Python中NumPy库提供的函数——np.random.randn的基本用法

一、基本用法np.random.randn是NumPy中用于生成服从标准正态分布(均值为0,标准差为1)的随机数的函数。它生成的随机数遵循标准正态分布,也称为高斯分布。以下是使用np.random.randn生成随机数的示例:importnumpyasnp#生成一个随机数,服从标准正态分布random_number=np.random.randn()print(random_number)#生成一个包含多个随机数的NumPy数组random_array=np.random.randn(3,4)#生成一个3x4的数组,包含随机数print(random_array)运行结果:这将生成一个或多个服