【发布时间】:2015-02-12 08:26:09
【问题描述】:
我看到这个问题可能已经在这里回答了:Random using WELL512
但是,它对用户不太友好,也没有提供如何在“现实世界”代码中使用它的示例。
这是我目前拥有的:
#define m (unsigned long)2147483647
#define q (unsigned long)127773
#define a (unsigned int)16807
#define r (unsigned int)2836
static unsigned long seed;
void x_srandom(unsigned long initial_seed);
unsigned long x_random(void);
void x_srandom(unsigned long initial_seed)
{
seed = initial_seed;
}
unsigned long x_random(void)
{
int lo, hi, test;
hi = (seed / q);
lo = (seed % q);
test = (a * lo - r * hi);
if (test > 0)
seed = test;
else
seed = (test + m);
return (seed);
}
int RANDOM(int from, int to)
{
if (from > to)
{
int tmp = from;
from = to;
to = tmp;
}
return ((x_random() % (to - from + 1)) + from);
}
// Real world function using RANDOM()
void testFunction()
{
printf("A random number between 1 and 1000 is %d \r\n", RANDOM(1, 1000));
printf("A random number between 36 and 100 is %d \r\n", RANDOM(36, 100));
printf("A random number between 1 and 2147483647 is %d \r\n", RANDOM(1, 2147483647));
printf("A random number between 1 and 5 is %d \r\n", RANDOM(1, 5));
}
上面的例子展示了实现它所需要知道的一切。
我想使用 WELL512 来确定我的随机数,而不是我目前的方式,按照上面的例子。
【问题讨论】:
-
对除 2 的幂(如 1000 或 36)以外的任何值使用模数会产生有偏差的分布。你应该避免这样做。