我创建了一个测试应用程序,可以生成0到250 000范围内的10k随机数。然后我计算出MAX和min值,并注意到MAX值总是在32k左右......
您是否知道如何扩展可能的范围?我需要一个MAX值约为250 000的范围!
答案 0 :(得分:9)
这是根据rand()的定义,见:
http://cplusplus.com/reference/clibrary/cstdlib/rand/
http://cplusplus.com/reference/clibrary/cstdlib/RAND_MAX/
如果您需要更大的随机数,您可以使用外部库(例如http://www.boost.org/doc/libs/1_49_0/doc/html/boost_random.html)或自己计算多个小随机数中的大型随机数。
但要注意你想要的分配。如果你只是总结小的随机数,结果将不会平均分配。
如果您只是按常数因子缩放一个小的随机数,则可能的值之间会有间隙。
使用随机数的乘积也不起作用。
可能的解决方案如下:
1) Take two random numbers a,b
2) Calculate a*(RAND_MAX+1)+b
因此,您可以获得均匀分布的随机值,最高可达(RAND_MAX + 1)^ 2-1
答案 1 :(得分:3)
据推测,您还希望在此扩展中获得平等分配 范围。关于你可以有效地做到这一点的唯一方法是生成一个 较小数字的序列,并将它们缩放,就像你在工作中一样 不同的基础。例如,对于250000,您可能有4个随机数 在[0,10]范围内和范围[0,25]中的一个,沿着这些行:
int
random250000()
{
return randomInt(10) + 10 * randomInt(10)
+ 100 * randomInt(10) + 1000 * randomInt(10)
+ 10000 * randomInt(25);
}
为此,你的随机数生成器必须是好的;许多
rand()
的实现不是(或者至少不是 - 我没有
最近核实了情况)。你也想要消除
当您将RAND_MAX + 1
个不同的值映射到10
或时,您会得到偏见
25
个不同的值。除非RAND_MAX + 1
是完全倍数
10
和25
(例如50
的完全倍数),您需要一些东西
像:
int
randomInt( int upperLimit )
{
int const limit = (RAND_MAX + 1) - (RAND_MAX + 1) % upperLimit;
int result = rand();
while ( result >= limit ) {
result = rand();
return result % upperLimit;
}
(执行此操作时注意:有些机器RAND_MAX + 1
会溢出;如果可移植性是一个问题,你需要采取
其他预防措施。)
当然,所有这一切都假设一台质量很好的发电机,这是远远不够的 来自给定的。
答案 2 :(得分:1)
您可以通过生成较小的随机数来按位操作数字。
例如,如果您需要32位随机数:
int32 x = 0;
for (int i = 0; i < 4; ++i) { // 4 == 32/8
int8 tmp = 8bit_random_number_generator();
x <<= 8*i; x |= tmp;
}
如果你的数字不需要良好的随机性,你可以使用rand()&amp; 8位随机数发生器的0xff。否则,将需要更好的东西。
答案 3 :(得分:0)
按N / RAND_MAX
扩展您的数字,其中N
是您想要的最大值。如果数字合适,你可以这样做:
unsigned long long int r = rand() * N / RAND_MAX;
显然,如果初始部分溢出,则无法执行此操作,但使用N = 250000
时,您应该没问题。在许多流行的平台上,RAND_MAX
是32K。
更一般地说,要在区间[A, B]
中统一获取随机数,请使用:
A + rand() * (B - A) / RAND_MAX;
当然你应该使用正确的C ++风格的<random>
库;在这个网站上搜索许多类似的问题,解释如何使用它。
编辑:为了防止评论升级,这里是Proper C ++解决方案的另一个复制/粘贴,用于在[A, B]
间隔内实现真正统一的分发:
#include <random>
typedef std::mt19937 rng_type;
typedef unsigned long int int_type; // anything you like
std::uniform_int_distribution<int_type> udist(A, B);
rng_type rng;
int main()
{
// seed rng first:
rng_type::result_type const seedval = get_seed();
rng.seed(seedval);
int_type random_number = udist(rng);
// use random_number
}
别忘了看看RNG!如果存储种子值,则可以稍后重放相同的随机序列。
答案 4 :(得分:0)
你使用的是短期投注吗?如果是这样,您将看到32,767作为您的最大数量,因为任何更大的数字都会溢出短整数。