내가 좋아하는 그것에 C와 40 다른 페이지 ++에 대해, 물건 위의 모든 빨간색 이 와 감시 "STL"스테판 T. Lavavej에서 비디오를
여전히 내가 알아 내기 위해 전체 일요일을했다, 그래서 확인하는 방법 임의의 숫자 작품 실천에 없었다 그것의 모든 것 그리고 그것이 작동하고 어떻게 사용될 수 있는지.
제 생각에 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에 의해 생산되었습니다. 일부 응용 프로그램에는 임의의 부동 소수점 숫자가 필요합니다. 일부 프로그램에는 불균일 분포를 나타내는 숫자가 필요합니다. 프로그래머는 rand에 의해 생성 된 숫자의 범위, 유형 또는 분포를 변환하려고 할 때 비 랜덤 성을 종종 나타냅니다. (Lippmans C ++ primer 5 판 2012 인용)
마지막으로 Bjarne Stroustrups에서 최신 20 권의 책 중 최고의 설명을 발견했습니다. "C ++ 2019 둘러보기", "C ++ 2016을 사용한 프로그래밍 원칙 및 실습"및 "C ++ 프로그래밍 언어 4 판"에서 그의 내용을 알아야합니다. 2014 "및"Lippmans C ++ primer 5 판 2012 "의 일부 예 :
그리고 난수 생성기는 두 부분으로 구성되어 있기 때문에 정말 간단합니다.
(1) 일련의 난수 또는 의사 난수 값을 생성하는 엔진. (2) 해당 값을 범위의 수학적 분포로 매핑하는 분포.
Bjarne Stroustrups는 Microsoft의 STL 직원의 의견에도 불구하고 다음과 같이 씁니다.
에서 표준 라이브러리는 난수 엔진 및 분포 (§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을 통해 또는 의견 섹션에서 그것에 대해 들려 드리겠습니다 필요한 경우 추가하거나이 게시물을 수정합니다. 부울