물흐르듯코딩

[Javascript] crypto.getRandomValues() 난수 생성 - 0 이상 1 미만 난수 생성법 본문

FE

[Javascript] crypto.getRandomValues() 난수 생성 - 0 이상 1 미만 난수 생성법

AquaDev 2024. 5. 9. 12:25

 

 

Math.random()은 0 이상 1 미만 범위에서 랜덤한 부동소수점 값을 반환하는 함수이다.

이 함수는 암호학적으로 안전한 난수를 제공하지 않기 때문에

보안에 민감한 Math.random 대신 다른 함수를 사용해야 한다.

 


 

해결방법

 

Math.random()을 대신하여 expo-crypto 라이브러리를 설치하여 crypto 함수로 난수를 생성한다. crypto.getRandomValues()를 이용하여 랜덤 숫자가 들어간 배열을 구할 수 있다.

const generateRandom = () => {
    let array = new Uint32Array(1);
    return crypto.getRandomValues(array)[0] / (0xffffffff + 1);
};

 

let array = new Uint32Array(1)

array라는 변수에 new Uint32Array(1) 8비트 랜덤 배열 1개를 할당

 

 

crypto.getRandomValues(array)[0] / (0xffffffff + 1)

crypto.getRandomValues() 함수를 호출하여 난수를 생성한다.

0 이상 1 미만의 범위값을 얻기 위해 (0xffffffff + 1)을 나눈 후 리턴한다.

0xffffffff는 32비트에서 모든 비트가 1이므로, 4294967295와 같은 값을 나타낸다.

 

따라서 0xffffffff + 1 대신 4294967296을 사용하여

crypto.getRandomValues(array)[0] / 4294967296

요렇게 표현해도 무방하다.

 

출처:  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray