草庐IT

C++ 从 1 到一个非常大的数(例如 2500 万)的随机数

你会如何编写一个函数来生成1到2500万之间的随机数?我考虑过使用rand()但我认为最大数量RAND_MAX是=32000(大约)是否正确?有没有办法解决这个问题,既不降低选择极低数字的概率,也不增加选择高/中数字的概率?编辑:@JameyD的方法完全独立于Qt。 最佳答案 您可以(应该)使用新的C++11std::uniform_real_distribution#includestd::random_devicerd;std::mt19937gen(rd());std::uniform_real_distributiondis

c++ 为 psudo 随机数生成器生成一个好的随机种子

我正在尝试为伪随机数生成器生成良好的随机种子。我想我会得到专家的意见。让我知道这是否是一种糟糕的做法,或者是否有更好的方法。#include#include#include#includeunsignedintgood_seed(){unsignedintrandom_seed,random_seed_a,random_seed_b;std::ifstreamfile("/dev/random",std::ios::binary);if(file.is_open()){char*memblock;intsize=sizeof(int);memblock=newchar[size];fi

c++ - 使用 TR1/dev/random 在 C++ 中生成随机数(弹性到 <1 秒运行)

我想在C++中生成0到1之间的统一随机数,其方式不使用标准rand()和srand(time(NULL))方法。这样做的原因是,如果我在时钟的同一秒内多次运行应用程序,种子将完全相同并产生相同的输出。我不想依赖提升或操作系统/编译器细节。可以假定为x86。似乎另一种方法是使用TR1(我没有C++11)并以某种方式使用/dev/random进行播种?现在我有这个,但它仍然使用time(NULL)作为种子,在1秒内运行将无法正常工作:#include#includeintmain(){std::tr1::mt19937eng;eng.seed(time(NULL));std::tr1::u

c++ - 适当的 boolean 随机生成器(伯努利分布)

我很想知道randomC++11库中是否有默认的随机boolean生成器。我一直在使用返回0或1的int生成器,然后转换为bool但我正在尝试优化我的代码并认为我可以通过使用from开始一个bool生成器,如果它存在的话。 最佳答案 参见std::bernoulli_distribution在header,恰本地以Bernoullidistribution命名.std::random_devicedevice;std::mt19937gen(device());std::bernoulli_distributioncoin_flip

c++ - 与 C++ 2011 不相关的并行随机种子?

目前,我有一个Fortran语言的主要应用程序,它需要一个种子来生成伪随机数。我想用完全不相关的种子(以及完全独立的伪随机数链)运行这个应用程序很多(很多)次。我的问题是:如何使用C++2011生成种子? 最佳答案 在您的主线程中,从良好的随机源(例如,Linux上的/dev/urandom)中提取单个种子(或种子序列)。使用该数据为单个根PRNG播种。然后使用thatPRNG为您的线程局部PRNG生成种子值。#include#includetypedefstd::mt19937rng_type;std::uniform_int_d

c++ - 如何打乱数组以便所有元素改变它们的位置

我需要打乱一个数组,以便所有数组元素都应该改变它们的位置。给定一个数组[0,1,2,3]可以得到[1,0,3,2]或[3,2,0,1]而不是[3,1,2,0](因为2保持不变)。我想算法不会是特定于语言的,但为了以防万一,我在C++程序中需要它(由于额外的要求,我不能使用std::random_shuffle)。 最佳答案 这个呢?分配一个数组,其中包含从0到arrayLength-1的数字打乱数组如果数组中没有索引等于其值的元素,则继续执行步骤4;否则从第2步开始重复。使用打乱后的数组值作为数组的索引。

c++ - 多次调用 srand 如何影响随机性的质量?

这comment,其中指出:srand(time(0));Iwouldputthislineasthefirstlineinmain()insteadifcallingitmultipletimes(whichwillactuallyleadtolessrandomnumbers)....并且我将遇到问题的行加粗了...重复常见建议以调用srand曾经在一个程序中。类似srand()—whycallonlyonce?的问题再次重申,因为time(0)以秒为单位返回当前时间,所以在同一秒内多次调用srand将产生相同的种子。一个常见的解决方法是改用毫秒或纳秒。但是,我不明白为什么这意味着

c++ - 为 C++ 类播种 rand()

我正在开发一个在构造函数中使用rand()的C++类。我真的很希望这个类在几乎所有方面都能照顾好自己,但我不确定在哪里播种rand()。如果我在构造函数中播种rand(),则每次构造我的对象类型的新实例时都会播种。因此,如果我按顺序创建3个对象,它们将在同一秒内创建,因此rand()具有相同的种子,从而为3个实例中的每一个实例生成完全相同的数据对象。我想在类代码中播种rand(),而不是在创建对象之前在程序的主要函数中进行播种。我想做一个staticboolseeded;变量来表示rand()是否已经播种,但我不太确定如何将它初始化为false在创建类时。我的想法是这样的myConst

c# - C++ 相当于 C# 中的 new Random(seed)

当我们在C#中使用随机数生成器时,我们可以像这样定义一个变量privateRandom_rndGenerator;在一个类中然后调用_rndGenerator=newRandom(seed);在类的构造函数中正确。我的问题是:这种定义的C++等价物是什么(即类中的RNG)。我认为这不是正确的使用方法srand((unsignedint)seed);对吗? 最佳答案 C++11具有更强大的随机数生成工具。这是一个例子:#include#includestd::size_tget_seed();//whateveristheprefer

c++ - 使用 C++ 随机选择算法的良好实践

设置:必须生成伪随机模式。有多种方法/或算法可用于创建不同的内容。所有算法都会生成一个字符列表(但可以是任何其他字符)……重要的是,它们都返回相同类型的值,并且需要相同类型的输入参数。必须能够调用方法GetRandomPattern(),每次调用时都会使用随机算法。我的第一个方法是将每个算法放在它自己的函数中,并在每次调用GetRandompattern()时随机选择一个。但是我没有想出另一种在它们之间进行选择的方法,而是使用不方便、丑陋且不灵活的switchcase语句。classPatternGenerator{public:listGetRandomPattern();priva