什么是最好的方法呢?我的编译器显示RAND_MAX = 32,767。因此,我很好奇如何在0到100,000之间获得均匀随机生成的值?
我将把juanchopanza的评论放在答案中。
如果您的编译器提供了它(C++11),请使用<random>
头文件。
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<> dis(0, 10000);
std::cout << dis(gen) << std::endl;
&131071
),并拒绝任何大于100,000的值。请注意,这具有非确定性运行时间,但这是获得非偏差分布的唯一直接方法。请勿使用模运算符。 - Damon& 131071
当然是伪装成模运算符 % 131072
的取模运算符,所以说永远不要使用模运算符有点不真诚。当 (rand_max + 1) mod n > 0
时,无论如何取模(任何伪装),都会存在偏差。 - MSaltersRAND_MAX
中获取17位并尝试神奇地拉出15位,那是行不通的(如果你想称之为“偏差”,那就是偏差),但这就是我说需要组合两个随机数的原因,例如rand()|(rand()<<15)
,以获得足够的随机位。无论你是否移位,随机位都是同样随机的... - Damon(8+1)模2 > 0
,但(8+1)模3 = 0
。 - MSaltersRAND_MAX
至少为32767。基于"rand()没有问题"的假设进行推断是一个坏主意;我们知道它通常存在问题。 - MSalters我很久以前在某个网站上找到了下面的函数。作者声称该函数能够提供良好的均匀性。
#define RS_SCALE (1.0 / (1.0 + RAND_MAX))
double drand(void)
{
double d;
do {
d = (((rand () * RS_SCALE) + rand ()) * RS_SCALE + rand ()) * RS_SCALE;
} while (d >= 1); /* Round off */
return(d);
}
如下评论所述,此代码返回的是0到1之间的数字,请将其乘以100000,即 drand()*100000
。
[0, 1)
,没有回答问题。 - Mihai Maruseacrand
中没有足够的位数(RAND_MAX 为32k)来处理这种情况。除非您进行一些黑客操作,例如调用 rand
两次并组合输出,否则您的分布将会有“空洞”。 - Damon#include <time.h>
,然后你可以写srand(time(NULL));
来为随机函数种子赋值。然后你只需要使用这行代码:(rand() % 99999 + 1);
。这应该会给你一个在0到100,000之间的随机值。如果需要,你也可以将其分配给一个变量:int myVar = (rand() % 99999 + 1);
。希望这有所帮助!(我希望我完全正确。我还在攻读计算机科学学位,仍在学习C++,但我以前做过这个并且它有效。)这是你的代码:
100000.0f * ((float)rand() / 32767.0f)
这将生成从0到100000的随机浮点数,但您可以在此处使用任何正数,而不是100000。
更新:
确实(感谢下面psj的评论),我意识到上述内容涵盖了0..100000范围的约1/3。
<random>
头文件。 - chrisstd::uniform_int_distribution
以及相关内容。 - juanchopanza