내일배움캠프

230606 자바스크립트 random() 대안으로 getRandomValues()

Neda 2023. 6. 6. 20:52

230606 자바스크립트 random() 대안으로 getRandomValues()

 

Math.random()

 0 이상 1 미만의 구간에서 근사적으로 균일한(approximately uniform) 부동소숫점 의사난수를 생성 -MDN
Math.random() // 0 <= x && x < 1
//0.7067886961595369

 

 

Math.random() - JavaScript | MDN

Math.random() 함수는 0 이상 1 미만의 구간에서 근사적으로 균일한(approximately uniform) 부동소숫점 의사난수를 반환하며, 이 값은 사용자가 원하는 범위로 변형할 수 있다. 난수 생성 알고리즘에 사용

developer.mozilla.org

 

crypto.getRandomValues()

 암호학적으로 강력한 임의 값을 생성 - MDN

TypedArray를 매개변수로 받아 배열의 모든 요소에 대해 난수를 생성하여 덮어 씌운다.

기존 배열이 변경되고, 반환 값도 기존 배열이다.

const array = new Uint32Array(1);
self.crypto.getRandomValues(array); 
/*
Uint32array 
[
1466988879, 
buffer: ArrayBuffer(4), 
byteLength: 4, 
byteOffset: 0, 
length: 1, 
Symbol(Symbol.toStringTag): 'Uint32Array'
]
*/
console.log(array===self.crypto.getRandomValues(array)) // true
 

Crypto: getRandomValues() method - Web APIs | MDN

The Crypto.getRandomValues() method lets you get cryptographically strong random values. The array given as the parameter is filled with random numbers (random in its cryptographic meaning).

developer.mozilla.org

 

getRandomValues로 만든 0~1사이의 수를 반환하는 함수

const getRandom = () => crypto.getRandomValues(new Uint8Array(1))[0] / 255;

이렇게 사용하면 통계적으로 한 쪽에 치우친 값을 반환하게 된다.

 

const getRandom = () => crypto.getRandomValues(new Uint32Array(1))[0] / (2**32);

이렇게 사용하는 것이 그나마 좋은 방법이다.