2013-07-30 2 views
3

0-255 사이의 숫자 목록을 생성하기 위해 std :: mt19937 난수 생성기를 사용하고 싶습니다. "일단 숫자가 선택 되었으면 세트에 다시 나타나지 않습니다. " - 어떻게해야할지 모르겠군요. 이것에 대한 수학적 용어는 나를 탈출 (!) 당신이 아무 중복이 없는지 확인합니다과 같이, std::vector 대신 std::set을 사용할 수std :: mt19937 mersenne 트위스터 분포가 아닌 반복 값

std::mt19937      twister; 
std::uniform_int_distribution<int> distribution; 

twister.seed(91210); 
distribution = std::uniform_int_distribution<int>(0,255); 

std::vector vNumbers; 
vNumbers.resize(256); 

for(int n = 0; n < 256; ++ n) 
    vNumbers[n] = distribution(twister); 
+1

다음 물론 iota


테에 의해 대체 될 수 있습니다 자신의 (구글 피셔 - 예이츠, 또는 크 누스 참조) 롤 수있는 당신은 그들이 생성되는 순서를 유지해야합니까? – BoBTFish

+1

아니요, 순서는 중요하지 않습니다. 나는 무작위 순서를 원한다. – fishfood

+1

유일성을 얻기 위해'std :: set'을 사용하면 숫자가 정렬된다. 나는. '57 1 9 44 102 1'을 생성하여'std :: set'에 저장하면'1 9 44 57 102'이됩니다. 이게 받아 들여질 수 있니? (그리고 당신은'mySet.size() == 255'까지 생성을 계속한다.) – BoBTFish

답변

10

그것을 위해 알고리즘을있다 :

// fill a vector ith [0..255]: 
std::vector<int> vNumbers(256); 
std::iota(vNumbers.begin(), vNumbers.end(), 0); 

// shuffle it 
std::random_shuffle(vNumbers.begin(), vNumbers.end()); 

// done 

(11) C++로 당신이 당신의 자신의 발전기에 전달할 수 있습니다 RNG : (의견도 참조하십시오)

std::shuffle(vNumbers.begin(), vNumbers.end(), twister); 

또는

for (int i=0; i<256; ++i) vNumbers[i] = i; 
+1

그리고 임의의 엔진을 사용하여 숫자를 섞어도됩니다! – Xeo

+0

자신 만의 롤링과 관련된 잠재적 인 문제점 중 하나는 모듈로 편향입니다. 2의 거듭 제곱은 문제가되지 않습니다 (PRNG 출력은 ​​0^2^w 또는 부호있는 동등한 것으로 가정). 그러나 염두에 두어야 할 가치가 있습니다. – delnan

+1

@delnan 그것만을 언급하는 것은 약간 미안하다 :/그래 : 그 배경 : http://eternallyconfuzzled.com/arts/jsw_art_rand.aspx – sehe

2

. 세트의 크기가 원하는 값의 숫자가 될 때까지 반복하십시오. 당신이 그냥 무작위 순서로 각 숫자 중 하나를 원하는 것 때문에


, 당신은 정말 그냥 0에서 255 시퀀스를 생성, 난수를 생성해야하고 무작위로 셔플하지 않습니다.

쉽게 std::iotastd::random_shuffle 같은 일부 standard algorithms으로 수행 할 수 있습니다

std::vector<int> values{256}; 
std::iota(values.begin(), values.end(), 0); 
std::random_shuffle(values.begin(), values.end()); 
+1

RNG가 반복을 생성하고 세트에 삽입되는 경우는 어떻습니까? 세트가 그것을 거절하면, 내 세트에 <255 개의 숫자가 남습니다. 임의의 숫자 생성기가 반복되는 데이터를 발행하지 않도록 지시하는 방법을 찾고 있습니다. – fishfood

+0

셰이더 프로그램에서 사용하기 위해이 데이터를 텍스처로 복사한다는 점도 지적해야합니다. 벡터를 사용하면 gfx 카드에 데이터를 쉽게 복사 할 수 있습니다. – fishfood

+1

@fishfood 세트의 크기가 원하는 값의 숫자가 될 때까지 계속하십시오. 필요한 경우 세트를 벡터에 쉽게 복사 할 수 있습니다. –

관련 문제