C++11에 새로 추가된 random 라이브러리의 난수 생성기((RNG. Random Number Generator) 오브젝트의 크기

 

RNG

gcc/64

gcc/32

Clang/64

MSVC/32

MSVC/64

minstd_rand0

8

4

8

4

4

minstd_rand

8

4

8

4

4

mt19937

5000

2500

5000

5000

5000

mt19937_64

2504

2504

2504

5008

5008

ranlux24_base

208

104

208

200

200

ranlux48_base

112

112

112

208

208

ranlux24

216

108

216

204

204

ranlux48

120

120

120

216

216

knuth_b

2064

1032

2064

1040

1040

 

 

 

출처: http://d.hatena.ne.jp/yohhoy/20131221/p1    https://gist.github.com/yohhoy/8032377 

 

 

저작자 표시
신고
by 흥배 2016.01.14 08:00

원문) generates same number in Linux, but not in Windows

http://stackoverflow.com/questions/32730906/random-generates-same-number-in-linux-but-not-in-windows 의 소개.

 

아래 코드에서 Linux 환경에서는 몇 번을 실행해도 1회째에 나오는 난수가 모두 같은데 왜 일까?

#include <iostream>

#include <random>

#include <time.h>

 

using namespace std;

 

int main()

{

    const int upper_bound = 100;

    const int lower_bound = 1;

 

    time_t system_time = time(0);   

 

    default_random_engine e(system_time);

    uniform_int_distribution<int> u(lower_bound, upper_bound);

 

    cout << '#' << '\t' << "system time" << endl

         << "-------------------" << endl;

 

    for (int counter = 1; counter <= 5; counter++)

    {

        int secret = u(e);

        cout << secret << '\t' << system_time << endl;

    }  

 

    system("pause");

    return 0;

}

 

1회 실행에서 5개의 난수를 출력하는 이 코드를 질문자는 Windows, Linux에서 각 5회씩 실행, Linux에서는 첫 번째 난수가 5 차례 모두 25가 나왔고 Windows에서는 이 현상이 일어나지 않았다고 한다.  2번째 이후는 Windows, Linux 모두 제 각각이었다.

 

< 실행 결과 >

| Windows:       | Linux:       

---------------------------------------

Run 1 | 54,01,91,73,68 | 25,38,40,42,21

Run 2 | 46,24,16,93,82 | 25,78,66,80,81

Run 3 | 86,36,33,63,05 | 25,17,93,17,40

Run 4 | 75,79,66,23,84 | 25,70,95,01,54

Run 5 | 64,36,32,44,85 | 25,09,22,38,13

 

본인도 테스트 해본 결과 Linux 환경에서 몇 번을 실행해도 18이 나왔다.

 

이 문제에 대한 답변

- GCC 표준 라이브러리의 libstdc++에서는 default_random_engine minstd_rand0, 즉 단순한 선형 합동 생성기이다.

- 난수의 생성 방법은 $x_{i+1}=(16807x_i+0)\mod\2147483647$이다. [1, 2147483646]까지 난수를 생성할 수 있다.

- 이 식에서 만일 난수의 시드를 1 바꾸면 1번째에 얻은 난수는 대개의 경우 16807만 달라지다.

- 한편 사건의 코드에서는 uniform_int_distribution에서 이를[1, 100]에 할당하고 있다. 만약 난수 n 2147483600 미만이면 (n-1)/21474836+1을 돌려주고. 이것 이외라면 새로운 난수에서 다시 시작.

- 라는 것은 비록 n 16807 다르다고 하더라도 대부분의 경우 같은 숫자를 반환한다. 좀 더 말하자면 21474836/16807=1278이므로 최대 1278=21.3 분까지는 1번째에서 같은 숫자가 나온다. 그래서 이 현상이 일어난다고 볼 수 있지 않을까?

- 참고로 MSVC에서는 default_random_engine mt19937라서 이 문제는 발생하지 않는다.

 

 

 

출처: http://qiita.com/gyu-don/items/b8798e53afc9b435ebce

 

저작자 표시
신고
by 흥배 2016.01.12 08:00

shuffle() 알고리즘과 난수 엔진을 사용한다

 

vector<int> v { 1, 2, 3, 4, 5, 6, 7 };

shuffle( v.begin(), v.end(), mt19937(random_device()()) );

 


저작자 표시
신고
by 흥배 2014.07.29 08:00
| 1 |