2013-03-05 1 views
0

MT에서 다른 난수를 얻을 수없고 시드 값이 고정 값입니다 (테스터가 제안한대로 변경되지 않음) . 그러나 프로그램에서 같은 함수를 두 번 호출하면 다른 값을 나타내지 만 프로그램을 여러 번 호출해도 값이 임의로 지정되지는 않습니다. 뒤에서 어디에서 뒤처지고 있는지 이해할 수 없습니다.
다음은이메르 센 트위스터에서 시드 값을 한 번 초기화하고 여러 번 다른 난수를 얻는 방법

날을 제안주세요

의 main.asc (미디어 서버를 플래시 관련) 파일 .ASC 광산에서 붙여 넣은 코드

load(shuffle.asc); 
    application.onAppStart=function() 
    { 
trace("Application Started"); 
    }; 

    application.onConnect=function(client,name) 
    { 

shuffledNumbers(); 
    } 

shuffle.asc

var gen_random; 


function shuffledeck() 
{ 
trace("shufledeck"); 

gen_random = new Array(); 

gen_random= new Array(); 

for(i=0;i<1000;i++) 
{ 
gen_random[i]=genrand_int32(); 
} 
trace("gen_random: "+gen_random); // HERE WE CAN SEE THE RANDOMLY GENERATED NUMBERS . THE PROBLEM: EVERYTIME I AM GETTING THE SAME RANDOM GENERATED VALUES. 

} 


    var N = 624; 
    var M = 397; 
    var MATRIX_A = 0x9908b0df; /* constant vector a */ 
    var UPPER_MASK = 0x80000000; /* most significant w-r bits */ 
    var LOWER_MASK = 0x7fffffff; /* least significant r bits */ 
    var mt =[]; /* the array for the state vector */ 
    var mti ; 
    var seed ; 
    var returnLength ; 
    var maxSize ; 
    var returnArray = new Array(); 




    /* initializes mt[N] with a seed */ 
    function init_genrand($seed) 
    { 
     mt[0]= $seed & 0xffffffff; 

     for (mti=1; mti<N; mti++) { 
      mt[mti] = (1812433253 * (mt[mti-1]^(mt[mti-1] >> 30)) + mti); 
      mt[mti] &= 0xffffffff; 
      /* for >32 bit machines */ 


     } 
    } 

    /* initialize by an array with array-length */ 
    /* init_key is the array for initializing keys */ 
    /* key_length is its length */ 
    /* slight change for C++, 2004/2/26 */ 
    // void init_by_array(unsigned long init_key[], int key_length) 

    /* generates a random number on [0,0xffffffff]-interval */ 
    function genrand_int32()  
    { 
     var y ; 
     var mag01 =[0x0, MATRIX_A]; 
     /* mag01[x] = x * MATRIX_A for x=0,1 */ 

     if (mti >= N) 
     { 
      /* generate N words at one time */ 
      var kk ; 

      if (mti == N+1) /* if init_genrand() has not been called, */ 
       init_genrand(15475454); /* a default initial seed is used */ 

      for (kk=0;kk<N-M;kk++) { 
       y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK); 
       mt[kk] = mt[kk+M]^(y >> 1)^mag01[y & 0x1]; 
      } 
      for (;kk<N-1;kk++) { 
       y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK); 
       mt[kk] = mt[kk+(M-N)]^(y >> 1)^mag01[y & 0x1]; 
      } 
      y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK); 
      mt[N-1] = mt[M-1]^(y >> 1)^mag01[y & 0x1]; 

      mti = 0; 
     } 

     y = mt[mti++]; 

     /* Tempering */ 
     y ^= (y >> 11); 
     y ^= (y << 7) & 0x9d2c5680; 
     y ^= (y << 15) & 0xefc60000; 
     y ^= (y >> 18); 
    // trace("y: "+y); 
     return y; 
    } 

    /* generates a random number on [0,0x7fffffff]-interval */ 
    function genrand_int31()  
    { 
     return (genrand_int32()>>1); 
    } 

도움이 될 것입니다

추 신 : 나는 int_genrand() 함수를 다시 채우고 출력을 얻음으로써 그들을 설득하려고 노력했지만, 그것은 무작위성의 예측 가능성을 손상시킨다. 당신은 한 벌의 카드를 셔플을 시도하는 경우

+1

Wath의()? – Smolniy

+1

@Smolniy 카드 더미. 셔플이 필요합니다. 우리는 math.random()을 사용하지 않으므로 MT 알고리즘을 사용하여 RNG 값을 얻습니다. – user1647017

+0

"리 시드하는 int_genrand()가 임의성의 예측 가능성을 손상시킵니다."라고 말하면됩니다. 나에게, 당신이 예측 가능한 난수 (지금 당장 가지고있는 결과)를 원하든 원하지 않는지 (당신이 원하는 것) – duTr

답변

0

,이 기능이 유용하다는 것을 발견했다 :

function fisherYates (myArray) { 
    var i = myArray.length; 
    while (i--) { 
    var j = Math.floor(Math.random() * (i + 1)); 
    var tempi = myArray[i]; 
    var tempj = myArray[j]; 
    myArray[i] = tempj; 
    myArray[j] = tempi; 
    } 
} 

사용 : 내장 인 Math.random 문제

myArray = [1,2,3,4,5]; 
fisherYates(myArray); 
+0

이것은 나중 단계에서 사용할 것이지만, Math.random)'함수에서, 위에서 언급 한'shuffle()'함수를 사용해야합니다. – user1647017

+0

@danjp 안녕하세요, @Smolniy, 가 난 그냥 라인'init_genrand (15475454)를 유지하여, 출력을 가지고 생각하며 함수 외부' 은 알려 주시기 바랍니다 (이 글로벌 만들기), 내 방식 올바른지 감사합니다. – user1647017

+2

문제를 올바르게 이해하고 있는지 잘 모르겠습니다. (질문에) main.asc에서는'shuffledNumbers()'를 호출하지만, shuffle.asc에는'shuffledNumbers'라는 이름의 함수가 없습니다. 하지만 일반적으로 시드 함수를 사용하는 임의의 생성자를 사용하는 경우 생성자를 사용하기 전에 현재 날짜를 인수로 사용하여 init 시드 함수를 호출해야합니다. 어쩌면'init_genrand ((new Date()). getTime()); '을 호출하여 문제를 해결할 수 있습니다. – Smolniy

관련 문제