2017-01-09 9 views
0

mt19937을 사용하여 배열을 반복하고 각 값을 정확히 한 번씩 임의의 순서로 가져오고 싶습니다. 근본적으로 mt19937을 사용하여 특정 범위 내의 모든 숫자를 정확히 한 번 생성 할 수 있습니다 (중복을 무시하지 않고 효율성을 위해 중복을 생성하지 않음)?Mersenne Twister를 사용하여 정확하게 두 숫자 사이의 모든 값을 생성하는 방법

나는 셔플 기능을 고려해 봤지만, 관심있는 색인 일뿐입니다. 배열 내의 값은 임의이지만 대응하는 인덱스가 중요합니다. 저는 1의 행렬을 가지고 있습니다. 무작위로 인덱스를 선택하고 1을 0으로 바꾸어야합니다.하지만이 계산을 필요한 것보다 더 많이 수행하고 싶지는 않습니다 (행렬에있는 요소만큼 정확하게).

+3

봐. – Jarod42

+0

이 문제를 직접 해결하려고 시도 했습니까? 또한이 문제는 사용중인 특정 난수 엔진 (mt19937)에 국한되지 않습니다. – Xirema

+1

난수는 중복을 생성합니다. 그렇지 않으면 난수가 아닙니다. 나는 Jarod42 제안을 ['std :: shuffle'] (http://en.cppreference.com/w/cpp/algorithm/random_shuffle)에서 들여다 보았다. –

답변

0

그래서 값 목록을 만들고 셔플해야합니다.

셔플하는 기능이 있지만 알고리즘은 간단합니다. 인덱스 0에서 시작하여 0에서 N-1 범위의 임의 값으로 스왑 한 다음 인덱스 1로 이동하여 1에서 N-1 범위의 임의 값으로 스왑하고, 0에서 스왑하지 않음 N-1은 순수한 무작위 순열을 제공하지 않습니다.

+0

셔플 기능을 고려했지만 실제로는 관심있는 색인 만 사용했습니다. 배열 내의 값은 임의이지만 대응하는 인덱스가 중요합니다. 본질적으로, 나는 1의 행렬을 가지고 인덱스를 무작위로 선택하고 1을 0으로 설정해야합니다. 그러나이 계산을 필요한 것보다 더 많이 수행하고 싶지는 않습니다 (행렬에있는 요소만큼 정확하게). 나는 나의 원래의 질문이 매우 불충분하게 말한 것을 알았다. 미안하다. – DrakeMurdoch

1

은 배열을 가정 크기 N이며 당신은 그것을 재 배열하고 싶지 않은 :

  1. 또한 크기 N의 두 번째 배열을 생성합니다.
  2. Fisher-Yates-Knuth shuffle을 사용하여 두 번째 배열을 섞습니다.
  3. 두 번째 배열에 지정된 순서대로 첫 번째 배열 요소를 사용합니다.

    //To shuffle an array a of n elements (indices 0..n-1): 
    for i from 0 to n−2 do 
        j ← random integer such that i ≤ j < n 
        swap a[i] and a[j] 
    

    또한 std::shuffle을 사용할 수 있습니다 :

피셔 - 예이츠 - 크 누스 셔플는 다음과 같이 구현 될 수 shuffle``에서

std::shuffle(a.begin(), a.end(), std::default_random_engine(seed));