gpt4 book ai didi

使用WELL512的两个整数之间的c++随机数

转载 作者:行者123 更新时间:2023-11-27 23:01:13 27 4
gpt4 key购买 nike

我看到这个问题可能已经在这里得到回答: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 来确定我的随机数,而不是我目前使用的方式,按照上面示例的方式。

最佳答案

是时候放弃使用 % 来生成分布了。

对我来说,您应该使用 WELL512 作为统一的随机数生成器(就像标准库中的 mt19937)。您将它包装在一个类中,该类公开(或使用)result_type 的 typedef。在您的情况下,这可能是无符号长。然后你需要两个 constexpr 用于 min() 和 max()。那将是 0 和 ULONG_MAX。最后,您需要公开返回单个 unsigned long 的 operator()。

之后您可以使用 <random> 中的功能与您的引擎一起。

class well512 {
public:
typedef unsigned long result_type;
static constexpr result_type min() { return 0; }
static constexpr result_type max() { return ULONG_MAX; }
result_type operator()() { /* return some value from the underlying well512 implementation */ }
};

int main()
{
well512 engine();
std::uniform_int_distribution<> dist { 1, 5 };

for (int i = 0; i != 10; ++i)
{
std::cout << dist(engine) << std::endl;
}
return 0;
}

关于使用WELL512的两个整数之间的c++随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27463757/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com