如何编写可控的随机数生成器
How to write a controllable random number generator?
我希望随机数生成具有变量。例如,如果我说100,则应以最大的随机性生成数字,如果我说50,则数字不应"如随机"。如果我说" 0",则可能根本不应该随机数 - 也许生成的所有数字都是相同的。
知道我可以用什么来生成这样的受控随机数?知道是否有某些C 内置库,或者也许Boost库会这样做?
有一个很好的方法来再生相同的随机数序列,因此播种发电机的一种方法也很好。
您描述要求的方式似乎表明,使用正常分布(又称高斯分布)可能是必要的。它有两个参数:均值和标准偏差。如果将标准偏差设置得非常低,则会获得的随机值可能与均值非常接近。如果将其设置为较大的价值,则将它们分配得更广泛。
在C 11中,可以从标准库中获得正态分布。如果C 11不是您的选择,那么Boost库也可以。
这是一些示例代码:
#include <iostream>
#include <iomanip>
#include <string>
#include <map>
#include <random>
#include <cmath>
#include <iomanip>
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::cout << std::fixed << std::setprecision(3);
/* Mean 5, standard deviation very low (0.002): */
std::normal_distribution<> d1(5,0.002);
for (int i = 0 ; i < 20 ; ++i)
std::cout << std::setw(7) << d1(gen) << " ";
std::cout << std::endl;
/* Mean 5, standard deviation relatively high (2.0): */
std::normal_distribution<> d2(5,2);
for (int i = 0 ; i < 20 ; ++i)
std::cout << std::setw(7) << d2(gen) << " ";
std::cout << std::endl;
return 0;
}
这是输出:
4.998 5.003 5.001 5.002 5.001 5.001 4.998 5.000 4.999 5.001 5.000 5.003 4.999 5.000 5.001 4.998 5.000 4.999 4.996 5.001
2.781 3.795 5.669 -0.109 7.831 3.302 3.823 4.439 4.672 4.461 6.626 5.139 6.882 5.406 6.526 5.831 6.759 2.627 3.918 4.617
您可以看到,在第一行中,所有数字都非常接近5(即使用您的措辞,"随机性"很低),而在第二行中,数字的传播更广泛。
(编辑:当然,这些数字的随机性并没有真正影响。只是标准偏差参数使值更有可能在较小(stddev low)或更宽的范围内出现。(stddev高)数字范围。)
Boost有一个库可以准确地完成您想要的工作。请按照此链接指向Boost教程页面,以教您如何进行数字分布。
此XKCD有一个点;您可能需要一会儿冥想。确实没有"随机数"之类的东西,就像没有"无趣的数字"之类的东西一样。
您可以要求的是一系列满足某些测试的数字;例如,在任何子序列中,每个值的频率大致相同,或者在序列中数字及其后继之间没有相关性。这些测试并未证明该序列是"随机"。只是它可能代表其他此类序列;也许在现实世界中出现的序列,除非受到非,亚或超自然力的约束。
在Rosencrantz和Guildenstern的简单硬币翻转序列中,很容易看到有偏分的分布引起了疑问,甚至存在疑问。但是,假设硬币翻转已经完全平衡了:头部,尾巴,头部,尾巴,头部,尾巴,头,尾巴等通过喀尔巴阡山峰。这会或多或少是随机的吗?正如R(或G)所说,"讨论"。
首先生成一个随机序列。
当旋钮处于100处时,将序列单独放置。
当旋钮在50处时,每隔一点都要为1。
当旋钮在0时,每一点都要为1。
[更新,要详细说明]
这个建议并不像听起来那样任意。
真正随机的数据源具有每个数据的熵。如果您想要一半的熵速率 - 即每个两个数据的熵一点点 - 您只需将其他一点设置为1。三个数据 - 您只能将三个位中的每2位设置为1。
"每位数据的熵位"是一个完全合理的定义,对于数字序列的随机程度,当三个位中的2分中的2个是随机的,而其他序列是随机的,而其他序列是随机的。修复是一个很自然的定义。
可能最简单的解决方案是在C 中使用srand和rand,均使用伪随机,srand中的种子值越大,在模式中出现的时间就越多。兰德生成的随机数
编辑:
http://www.cplusplus.com/reference/clibrary/cstdlib/srand/
r1 = Mathf.PingPong(Mathf.PerlinNoise(map,23)*5+map*.01, 1);
map是随机种子,一个整数,ping-pong弹跳在0到1之间的所有值,Perlin噪声使某种噪声通过向其添加一个倍的MAP通过在0到1之间均匀。<<<<<<<<<<<<<<<<<<<<<<<<<<<</p>
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 制作具有平均值的随机数生成器
- C++ 随机数生成器:尝试将结果作为向量获取,但通过制作 void 函数来执行此操作而出现错误
- 尝试在 c++ 中创建随机数生成器并收到错误
- 存储并重新加载随机数生成器状态
- 作为随机数生成器的争用条件
- 播种随机数生成器以使用分叉的好方法是什么?
- 随机数生成器的性能因平台而异
- 随机数生成器的种子和状态有什么区别?
- RcppShark 随机森林示例引发有关随机数生成器的异常
- C++多个实例的随机数生成器组种子中增强
- C++随机数生成器仅生成 0 - C++ 11
- GSL+OMP:C++中的线程安全随机数生成器
- 贪吃蛇游戏 - 食物瓷砖的随机数生成器
- 随机数生成器在 C++ 用于 skipList.
- RSA 加密和解密期间的随机数生成器要求
- 如何使用 cpp 设置随机数生成器的语法?
- 产生相同结果的随机数生成器
- 为 STL 随机数生成器编写工厂方法
- 如何编写可控的随机数生成器