간단한 질문이지만 뉘앙스에 관심이 있습니다.
다음과 같은 방법으로 임의의 부울을 생성하고 있습니다.
const rand = Boolean(Math.round(Math.random()));
나타날 때마다 random()
항상 함정이있는 것 같습니다-그것은 실제로 무작위가 아니며, 무언가 또는 다른 것에 의해 타협되었습니다. 그래서, 알고 싶습니다 :
a) 위의 방법이 최선의 방법입니까?
b) 내가 너무 생각 하는가?
c) 내가 생각하는 것입니까?
d) 내가 모르는 더 나은 / 빠른 / 우아한 방법이 있습니까?
(B와 C가 상호 배타적이라면 다소 관심이 있습니다.)
최신 정보
차이가 있다면 AI 캐릭터의 움직임에 이것을 사용하고 있습니다.
답변
엄밀히 말하면 코드는 좋아 보이지만 너무 복잡합니다. 당신은 비교할 수 Math.random()
에 0.5
의 범위로, 직접 Math.random()
IS [0, 1)
( ‘0을 포함, 1 곳의 범위 0 있지만 1’이 의미). 범위를 [0, 0.5)
및 로 나눌 수 있습니다 [0.5, 1)
.
var random_boolean = Math.random() >= 0.5;
// Example
console.log(Math.random() >= 0.1) // %90 probability of get "true"
console.log(Math.random() >= 0.4) // %60 probability of get "true"
console.log(Math.random() >= 0.5) // %50 probability of get "true"
console.log(Math.random() >= 0.8) // %20 probability of get "true"
console.log(Math.random() >= 0.9) // %10 probability of get "true"
답변
답변
보다 암호화 된 보안 가치를 위해 crypto.getRandomValues
최신 브라우저에서 사용할 수 있습니다 .
견본:
var randomBool = (function() {
var a = new Uint8Array(1);
return function() {
crypto.getRandomValues(a);
return a[0] > 127;
};
})();
var trues = 0;
var falses = 0;
for (var i = 0; i < 255; i++) {
if (randomBool()) {
trues++;
}
else {
falses++;
}
}
document.body.innerText = 'true: ' + trues + ', false: ' + falses;
참고 것을 crypto
이 노드에서 사용할 수 없습니다, 그러나, 그래서 객체는 DOM API입니다 노드에 대한 유사한 API가있다 .
답변
!Math.round(Math.random());
답변
켈빈의 답변에 많은 감명을 받았지만 상당히 비슷하지만 약간 향상된 솔루션을 제안하고 싶습니다.
var randomBoolean = Math.random() < 0.5;
이 솔루션은 읽기가 좀 더 분명합니다. 오른쪽에있는 숫자 는 이해하기보다 자연 스러울 <
가능성이 true
있기 때문입니다 false
. 또한 <
하나보다 짧은 하나의 기호입니다 >=
.
답변
이건 어때?
return Math.round((Math.random() * 1) + 0) === 0;
답변
노드 코드 스 니펫 추가
const crypto = require('crypto');
const randomBool = (function () {
let a = new Uint8Array(1);
return function () {
crypto.randomFillSync(a);
return a[0] > 127;
};
})();
let trues = 0;
let falses = 0;
for (let i = 0; i < 100; i++) {
if (randomBool()) {
trues++;
}
else {
falses++;
}
}
console.log('true: ' + trues + ', false: ' + falses);