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() 함수를 다시 채우고 출력을 얻음으로써 그들을 설득하려고 노력했지만, 그것은 무작위성의 예측 가능성을 손상시킨다. 당신은 한 벌의 카드를 셔플을 시도하는 경우
Wath의()? – Smolniy
@Smolniy 카드 더미. 셔플이 필요합니다. 우리는 math.random()을 사용하지 않으므로 MT 알고리즘을 사용하여 RNG 값을 얻습니다. – user1647017
"리 시드하는 int_genrand()가 임의성의 예측 가능성을 손상시킵니다."라고 말하면됩니다. 나에게, 당신이 예측 가능한 난수 (지금 당장 가지고있는 결과)를 원하든 원하지 않는지 (당신이 원하는 것) – duTr