ผมสีแดงทุกสิ่งข้างต้นประมาณ 40 หน้าอื่น ๆ ด้วย C ++ ในนั้นเช่นนี้และดูวิดีโอจากสเตฟานตัน Lavavej "STL"
และยังคงไม่แน่ใจว่าสุ่มตัวเลขงานใน Praxis ดังนั้นฉันจึงเต็มอาทิตย์ที่จะคิดออก มันเกี่ยวกับอะไรและทำงานอย่างไรและสามารถใช้งานได้
ในความคิดของฉัน STL ที่ถูกต้องเกี่ยวกับ "ไม่ได้ใช้ srand อีกต่อไป" และเขาอธิบายได้ดีในวิดีโอ2 เขายังแนะนำให้ใช้:
ก) 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 ++ อาศัยฟังก์ชันไลบรารี C แบบง่ายที่ชื่อ rand ฟังก์ชันนั้นจะสร้างจำนวนเต็มเทียมที่มีการกระจายอย่างสม่ำเสมอในช่วงตั้งแต่ 0 ถึงค่าสูงสุดที่ขึ้นกับระบบซึ่งมีค่าอย่างน้อย 32767 ฟังก์ชัน Rand มีปัญหาหลายประการ: หลายโปรแกรมต้องการตัวเลขสุ่มในช่วงที่แตกต่างจาก หนึ่งผลิตโดยแรนด์ บางแอปพลิเคชันต้องการตัวเลขทศนิยมแบบสุ่ม บางโปรแกรมต้องการตัวเลขที่แสดงถึงการแจกแจงแบบไม่สม่ำเสมอ โปรแกรมเมอร์มักจะแนะนำความไม่เป็นเงื่อนไขเมื่อพวกเขาพยายามที่จะเปลี่ยนช่วงประเภทหรือการกระจายของตัวเลขที่สร้างโดยแรนด์ (อ้างจาก Lippmans C ++ primer 5th edition 2012)
ในที่สุดฉันก็พบคำอธิบายที่ดีที่สุดจากหนังสือ 20 เล่มใน Bjarne Stroustrups ซึ่งเป็นหนังสือที่ใหม่กว่า - และเขาควรรู้เนื้อหาของเขาใน "A tour of C ++ 2019" "Programming Principles and Practice Using C ++ 2016" และ "The C ++ Programming Language 4th edition 2014 "และตัวอย่างบางส่วนใน" Lippmans C ++ primer 5th edition 2012 ":
และมันง่ายมากเพราะตัวสร้างตัวเลขสุ่มประกอบด้วยสองส่วน:
(1) เอ็นจิ้นที่สร้างลำดับของค่าสุ่มหรือสุ่มหลอก (2) การแจกแจงที่จับคู่ค่าเหล่านั้นเป็นการแจกแจงทางคณิตศาสตร์ในช่วง
แม้จะมีความเห็นของ Microsofts STL Guy 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()
{
cout << "\n" << endl;
for (int i = 0; i < 20; ++i)
cout << "###";
cout << "\n" << endl;
}
void uniform_default()
{
uniform_int_distribution<size_t> u (0, 6);
default_random_engine e;
for (size_t i = 0; i < 10; ++i)
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);
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_64 dist (1234);
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 หรือในส่วนความคิดเห็น และจะเพิ่มหากจำเป็นหรือแก้ไขโพสต์นี้ บูล