我红上述所有的东西,关于它40个其它页面与类似于C ++ 这样并观看了由斯蒂芬T. Lavavej“STL”的视频
仍然不知道随机数是如何工作的实践,所以我花了整整周日弄清楚它的全部内容以及它的工作方式和使用方式。
我认为STL关于“不再使用srand”是正确的,他在视频2中对此做了很好的解释。他还建议使用:
a)void random_device_uniform()
-用于加密生成,但速度较慢(以我的示例为例)
b)具有mt19937
-更快,能够创建种子的能力的示例,而不是加密的
我拿出了所有我拥有的声称拥有c ++ 11本书的书,发现例如Breymann(2015)之类的德国作家仍然使用
srand( time( 0 ) );
srand( static_cast<unsigned int>(time(nullptr))); or
srand( static_cast<unsigned int>(time(NULL))); or
只是<random>
代替<time> and <cstdlib>
#includings -所以要小心刚刚从一本书学习:)。
含义-自c ++ 11起不应该使用,因为:
程序通常需要一个随机数源。在新标准发布之前,C和C ++都依赖于名为rand的简单C库函数。该函数产生的伪随机整数在0到至少32767的系统相关最大值的范围内均匀分布。rand函数有几个问题:许多(如果不是最多的话)程序需要与兰德生产的一种。某些应用程序需要随机浮点数。某些程序需要反映不均匀分布的数字。程序员在尝试转换rand生成的数字的范围,类型或分布时,经常会引入非随机性。(引自Lippmans C ++入门2012年第五版)
我终于在Bjarne Stroustrups的新书中找到20本书中最好的解释-他应该知道他的东西-在“ C ++之旅2019”,“使用C ++ 2016编程原理和实践”和“ C ++编程语言第4版”中2014”和“ Lippmans C ++入门第五版2012”中的一些示例:
这真的很简单,因为随机数生成器由两部分组成:
(1)生成随机或伪随机值序列的引擎。(2)将这些值映射为范围内的数学分布的分布。
尽管有微软STL专家的意见,Bjarne Stroustrups写道:
在中,标准库提供了随机数引擎和分布(第24.7节)。默认情况下,使用default_random_engine,选择它是为了实现广泛的应用和低成本。
该void die_roll()
示例来自Bjarne Stroustrups-一个很好的主意,可以使用生成引擎并进行分发using
(更多信息请参见此处)。
为了能够实际使用标准库在 此处提供的随机数生成器,<random>
此处的一些可执行代码带有不同的示例,这些示例已减少到最希望为您节省时间和金钱的必要条件:
#include <random> //random engine, random distribution
#include <iostream> //cout
#include <functional> //to use bind
using namespace std;
void space() //for visibility reasons if you execute the stuff
{
cout << "\n" << endl;
for (int i = 0; i < 20; ++i)
cout << "###";
cout << "\n" << endl;
}
void uniform_default()
{
// uniformly distributed from 0 to 6 inclusive
uniform_int_distribution<size_t> u (0, 6);
default_random_engine e; // generates unsigned random integers
for (size_t i = 0; i < 10; ++i)
// u uses e as a source of numbers
// each call returns a uniformly distributed value in the specified range
cout << u(e) << " ";
}
void random_device_uniform()
{
space();
cout << "random device & uniform_int_distribution" << endl;
random_device engn;
uniform_int_distribution<size_t> dist(1, 6);
for (int i=0; i<10; ++i)
cout << dist(engn) << ' ';
}
void die_roll()
{
space();
cout << "default_random_engine and Uniform_int_distribution" << endl;
using my_engine = default_random_engine;
using my_distribution = uniform_int_distribution<size_t>;
my_engine rd {};
my_distribution one_to_six {1, 6};
auto die = bind(one_to_six,rd); // the default engine for (int i = 0; i<10; ++i)
for (int i = 0; i <10; ++i)
cout << die() << ' ';
}
void uniform_default_int()
{
space();
cout << "uniform default int" << endl;
default_random_engine engn;
uniform_int_distribution<size_t> dist(1, 6);
for (int i = 0; i<10; ++i)
cout << dist(engn) << ' ';
}
void mersenne_twister_engine_seed()
{
space();
cout << "mersenne twister engine with seed 1234" << endl;
//mt19937 dist (1234); //for 32 bit systems
mt19937_64 dist (1234); //for 64 bit systems
for (int i = 0; i<10; ++i)
cout << dist() << ' ';
}
void random_seed_mt19937_2()
{
space();
cout << "mersenne twister split up in two with seed 1234" << endl;
mt19937 dist(1234);
mt19937 engn(dist);
for (int i = 0; i < 10; ++i)
cout << dist() << ' ';
cout << endl;
for (int j = 0; j < 10; ++j)
cout << engn() << ' ';
}
int main()
{
uniform_default();
random_device_uniform();
die_roll();
random_device_uniform();
mersenne_twister_engine_seed();
random_seed_mt19937_2();
return 0;
}
我认为所有这些都加起来了,就像我说的,花了我大量的阅读和时间将其提炼为这些示例-如果您对数字生成有更多的了解,我很乐意通过pm或在评论部分中听到并将在必要时添加它或编辑此信息。布尔