정보 · 테크
Mysql rand 함수의 랜덤 값 Generator 만들기
아래 코드는 제가 mysql rand 함수의 소스 코드를 분석하여
랜덤 값 생성 알고리즘을 분석한 뒤 짠, 자바스크립트 코드입니다.
분석 과정을 설명하고 싶지만 아직 이미지 기능이 완전히 구비되어 있지 않아
나중에 보충하도록 하겠습니다.
class Random {
constructor(seed1, seed2) {
this.maxValue = 0x3FFFFFFF;
this.seed1 = seed1 % this.maxValue;
this.seed2 = seed2 % this.maxValue;
}
}
class ItemFuncRand {
constructor(arg, limit=10) {
this.seedRandom(arg);
this.limit = limit;
}
seedRandom(arg) {
this.randSt = new Random(arg * 0x10001 + 55555555, arg * 0x10000001);
this.arg = arg;
}
*myRnd() {
const randSt = this.randSt;
for(let i=0; i < this.limit; i++) {
randSt.seed1 = (randSt.seed1 * 3 + randSt.seed2) % randSt.maxValue;
randSt.seed2 = (randSt.seed1 + randSt.seed2 + 33) % randSt.maxValue;
yield randSt.seed1 / randSt.maxValue;
}
}
generate() {
const gen = this.myRnd();
console.log("Generate mysql's rand(%d) value %d times", this.arg, this.limit);
for(let value of gen) {
console.log(value);
}
}
}
클래스를 선언한 뒤
let rand = new ItemFuncRand(10)
rand.generate()
처럼 콘솔에 입력할 시
Generate mysql's rand(10) value 10 times
0.6570515219653505
0.12820613023657923
0.6698761160204896
0.9647622201263553
0.8141827833039526
0.17662728687434204
0.4405881151934975
0.6730587460781063
0.04352941554368419
0.19847087021774693
와 같이 랜덤 값을 올바르게 예측하는 것을 볼 수 있습니다.
올바른 랜덤 값인지 확인하는 방법은 mysql 콘솔에서
select rand(10) from (select 1 union select 2 ... select union select 10)t 과 같이 하시면 됩니다.
감사합니다.
#c
#code_auditing
#rand
#javascript
작성자 정보
댓글
0