[javascript] JS는 임의의 부울을 생성합니다

간단한 질문이지만 뉘앙스에 관심이 있습니다.

다음과 같은 방법으로 임의의 부울을 생성하고 있습니다.

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"


답변

프로젝트가 있다면 lodash다음을 수행 할 수 있습니다.

_.sample([true, false])


답변

보다 암호화 된 보안 가치를 위해 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;


답변

Alexander O’Mara의 답변

노드 코드 스 니펫 추가

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);