gpt4 book ai didi

c++ - 制作具有平均值的随机数生成器

转载 作者:行者123 更新时间:2023-11-28 04:31:10 26 4
gpt4 key购买 nike

我需要制作没有内置函数且平均值不超过0.5的随机数生成器。它必须生成 10000 个数字,最好不要重复。例如下面的 PRNG 代码:

#include <iostream>
using namespace std;

unsigned int Rand()
{
static unsigned int seed = 5323;
seed = 8253729 * seed + 2396403;
return seed % 32768;
}

int main()
{
for (int count=1; count <= 10000; ++count)
{
cout << Rand() << "\t";
if (count % 10 == 0)
cout << "\n";
}

return 0;
}

结果我有 10000 个数字,如果我尝试从第一行计算 10 个数字的平均值,我将不会收到 0.5。例如在第一行我们收到:

31222,24489,32444,25391,6402,11317,10440,6843,3598,3777

平均值为:15592.3。我可以用它做什么来降低这个值?

最佳答案

不要尝试推出自己的 PRNG

如果您获得了密码学学位,或者最终专攻 PRNG 开发,您将在教育或培训中学习必要的技术。尝试在这种情况之外这样做只会给你带来糟糕的结果。

使用<random>图书馆

C++ 的库功能旨在尽可能轻松地解决此类问题。

#include<random>
#include<iostream>

float get_random_value() {
static std::default_random_engine engine{std::random_device()()};
static std::uniform_real_distribution<float> distribution{0, 1};

return distribution(engine);
}

int main() {
for (int count=1; count <= 10000; ++count) {
std::cout << get_random_value() << "\t";
if (count % 10 == 0)
std::cout << "\n";
}
}

这段代码的组成部分如下所示:

  • std::default_random_engine是您的库实现认为适合默认使用的任何 PRNG 的别名。这通常默认为 std::mt19937 ,这是一种称为“Mersenne Twister”的 PRNG。 <random> 引用包含许多您可以考虑的其他引擎。
  • std::random_device是从操作系统请求“熵”的库功能。您需要担心的是,它被构造一次,被调用生成一个“种子”,然后被丢弃,不再被使用。如果您不使用它,或者如果您对这个调用返回的值进行硬编码,则每次运行您的程序时,引擎将始终以相同的顺序生成相同的值。
  • std::uniform_real_distribution是一个分布。使用为此分布指定的参数,您可以直接指定分布的范围。我们使用了 01因此该分布将返回 0 到 1 之间均匀分布的数字。还有其他可用的分布,您可以在引用资料中找到这些分布。
  • 获取值就像在分发对象上调用调用运算符一样简单,使用引擎作为其唯一参数。

此代码将可靠地生成 [0, 1) 范围内的数字,并且以一种惯用的、富有表现力的方式进行。如果您需要不同范围内的统一值,很容易调整此代码来处理它。如果您需要非均匀值(如正态分布),还有其他分布(如 std::normal_distribution )可以正确处理这种情况。

关于c++ - 制作具有平均值的随机数生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52842793/

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