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


134

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

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

const rand = Boolean(Math.round(Math.random()));

나타날 때마다 random()항상 함정이있는 것 같습니다-그것은 실제로 무작위가 아니며, 무언가 또는 다른 것에 의해 타협되었습니다. 그래서, 알고 싶습니다 :

a) 위의 방법이 최선의 방법입니까?

b) 내가 너무 생각 하는가?

c) 내가 생각하는 것입니까?

d) 내가 모르는 더 나은 / 빠른 / 우아한 방법이 있습니까?

(B와 C가 상호 배타적이라면 다소 관심이 있습니다.)

최신 정보

차이가 있다면 AI 캐릭터의 움직임에 이것을 사용하고 있습니다.


25
const rand = Math.random() < 0.5동등하고 간단합니다.
Hamms

3
당신은 진정한 무작위성이 아닌 의사 난수 만 얻을 수 있습니다 .
Oriol

실제로 무작위는 없습니다. 목표는 가능한 한 무작위에 가까워지는 것입니다.
Adam Buchanan Smith

그리고 50/50의 기회 math.random가 있다면 충분해야합니다. 씨앗에 밀리 초를 사용하십시오.
Adam Buchanan Smith

나는 시간을 꽤 임의의 한 방문하는 웹 사이트를 생각 :이 생각했다 ... D 있도록Boolean(+Date.now()%2)
로코 C. Buljan을

답변:


337

엄밀히 말하면 코드는 좋아 보이지만 너무 복잡합니다. 당신은 비교할 수 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"


3
나는 이것이 하나의 해결책을 좋아하는데, 그것이 당신이 참 / 거짓의 확률을 조정할 수있게하므로
Evanion

예를 들어 숫자를 0.5에서 0.9로 변경하면 거짓 확률이 증가합니까?
에이전트 Zebra

0.5에서 0.9로 변경하면 그러면 확률이 변경 될 수 있습니다. 10000 반복과 같은 수많은 임의 루프로 시도해 볼 수 있다고 생각합니다.
Kelvin

최신 JavaScript의 경우, letlet randomBool = Math.random() >= 0.5;
Chris Halcrow

27

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

_.sample([true, false])

13

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


4
Math.random()여러 가지면에서 악명 높은 것은 아니며, 다른 대체 제안
Charles Harris

3
5 만 번 실행 한 후에 평균 0.78 % 정도 더 많은 0이 생성 된 것을 발견 했으므로 여기에 작은 수정을 추가하려고합니다. return a [0] <= 127; (그렇지 (127)에 포함되지 않습니다)
Amund Midtskog을

2
@AmundMidtskog 좋은 전화. 다음을 입력해야합니다.a[0] > 127
Alexander O'Mara

1
그건 그렇고, 일반적으로 255보다 훨씬 많은 수의 샘플을 생성 할 수도 있습니다. 오히려 다른 의견에서 제안한 것처럼 데이터의 노이즈를 줄이기 위해 100,000-또는 심지어 수백만과 같은 0.78 %의 작은 오류를보고자합니다.
caw

8
!Math.round(Math.random());

­­­­­­­­­­­­­­


6
보다 유용하게 형식을 지정하고 ( stackoverflow.com/editing-help ) 설명을 추가하십시오. 코드 전용 답변은 그다지 높이 평가되지 않습니다. 설명을 추가하면 StackOverflow가 무료 코드 작성 서비스라는 오해와 싸우는 데 도움이됩니다.
Yunnosch

5

켈빈의 답변에 많은 감명을 받았지만 상당히 비슷하지만 약간 향상된 솔루션을 제안하고 싶습니다.

var randomBoolean = Math.random() < 0.5;

이 솔루션은 읽기가 좀 더 분명합니다. 오른쪽에있는 숫자 는 이해하기보다 자연 스러울 <가능성이 true있기 때문입니다 false. 또한 <하나보다 짧은 하나의 기호입니다 >=.


0

이건 어때?

return Math.round((Math.random() * 1) + 0) === 0;

1
OP는 이미 비슷한 방법을 사용하고 있으며 게시 할 필요가 없다고 말합니다.
Jacob Gunther

-1

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.