जेएस यादृच्छिक बूलियन उत्पन्न करते हैं


134

सरल सवाल है, लेकिन मैं यहाँ बारीकियों में दिलचस्पी रहा हूँ।

मैं अपने साथ आए निम्न विधि का उपयोग करके यादृच्छिक बूलियन उत्पन्न कर रहा हूं:

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

जब भी random()पता चलता है, ऐसा लगता है कि वहाँ हमेशा एक नुकसान होता है - यह वास्तव में यादृच्छिक नहीं है, यह कुछ या अन्य, आदि द्वारा समझौता किया जाता है। इसलिए, मैं जानना चाहता हूं:

a) क्या यह करने का सबसे अच्छा तरीका है?

b) क्या मैं चीजों को पछाड़ रहा हूँ?

ग) क्या मैं चीजों को कम कर रहा हूँ?

घ) क्या मुझे पता नहीं है कि एक बेहतर / तेज / सुरुचिपूर्ण-एर तरीका है?

(यदि बी और सी पारस्परिक रूप से अनन्य हैं तो भी कुछ हद तक दिलचस्पी रखते हैं।)

अपडेट करें

अगर इससे कोई फ़र्क पड़ता है, तो मैं इसे एक AI चरित्र के आंदोलन के लिए उपयोग कर रहा हूं।


25
const rand = Math.random() < 0.5समतुल्य और सरल है।
हम्सज़ २०'१६

3
आप केवल छद्मता प्राप्त कर सकते हैं , वास्तव में यादृच्छिकता नहीं।
ओरिओल

कुछ भी वास्तव में यादृच्छिक नहीं है, लक्ष्य जितना संभव हो उतना यादृच्छिक के करीब पहुंचना है।
एडम बुकानन स्मिथ

और अगर आपके पास 50/50 का मौका है, math.randomतो बहुत कुछ होना चाहिए। बस अपने बीज के लिए मिलीसेकंड का उपयोग करें।
एडम बुकानन स्मिथ

मुझे लगता है कि यह बहुत ही यादृच्छिक समय है जब एक वेबसाइट पर जाता है: डी तो मुझे यह विचार था ...Boolean(+Date.now()%2)
रोको सी। बुल्जन

जवाबों:


337

तकनीकी रूप से, कोड ठीक दिखता है, लेकिन बस थोड़ा बहुत जटिल है। आप तुलना कर सकते हैं Math.random()करने के लिए 0.5, सीधे की सीमा के रूप में Math.random()है [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
मुझे यह एक समाधान पसंद है, क्योंकि यह आपको सत्य / असत्य की संभावना को
मोड़ने की

यदि आप उदाहरण के लिए 0.5 से 0.9 की संख्या बदलते हैं, तो क्या यह गलत की संभावना को बढ़ाता है, और कैसे?
एजेंट ज़ेबरा

यदि आप इसे 0.5 से 0.9 में बदलते हैं। फिर, संभावना बदल जाने की संभावना है। मुझे लगता है कि आप इसे बड़ी संख्या में यादृच्छिक लूप के साथ आज़मा सकते हैं, जैसे 10000 पुनरावृत्तियों।
केल्विन

आधुनिक जावास्क्रिप्ट के लिए आप का उपयोग करना चाहिए letयानीlet randomBool = Math.random() >= 0.5;
क्रिस 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 है, इसलिए यह Node में उपलब्ध नहीं है, लेकिन Node के लिए समान API है


4
Math.random()कई मायनों में शानदार गैर-यादृच्छिक है, बढ़िया वैकल्पिक सुझाव
चार्ल्स हैरिस

3
मैं यहां केवल एक छोटा सुधार जोड़ने जा रहा हूं, जैसा कि मैंने 50 000 000 रन के बाद पता लगाया कि यह औसतन 0.78% या इतने अधिक शून्य उत्पन्न करता है: एक [0] <= 127 लौटाएं; (एल्से 127 कभी शामिल नहीं होता है)
अमुंड मिड्सकॉग

2
@AmundMidtskog अच्छी कॉल। मुझे टाइप करना चाहिए:a[0] > 127
अलेक्जेंडर ओ'मैरा

1
वैसे, आप आमतौर पर केवल 255 से अधिक बड़ी संख्या में नमूने उत्पन्न करना चाह सकते हैं। बल्कि, डेटा में शोर को कम करने के लिए, 100,000 की तरह कुछ - या लाखों भी, जैसा कि अन्य टिप्पणी में सुझाया गया है, यदि आप त्रुटियों को 0.78% के रूप में छोटा देखना चाहते हैं।
कांव-कांव

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

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


6
कृपया इसे और अधिक उपयोगी रूप से प्रारूपित करें ( stackoverflow.com/editing-help ) और कुछ स्पष्टीकरण जोड़ें। कोड-ओनली उत्तरों की बहुत प्रशंसा नहीं की जाती है। एक स्पष्टीकरण जोड़ने से भ्रांति से लड़ने में मदद मिलेगी कि StackOverflow एक मुफ्त कोड-लेखन सेवा है।
युनानोस्क

5

केल्विन के जवाब से बहुत प्रभावित होकर मैं काफी हद तक समान लेकिन थोड़ा बढ़ा हुआ समाधान सुझाना चाहूंगा।

var randomBoolean = Math.random() < 0.5;

यह समाधान पढ़ने में थोड़ा अधिक स्पष्ट है, क्योंकि दाईं ओर की संख्या <आपको प्राप्त करने के trueबजाय प्राप्त करने की संभावना बताती है false, जो समझने के लिए अधिक स्वाभाविक है। इसके अलावा <एक प्रतीक से कम है >=;


0

इसके बारे में क्या खयाल है?

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

1
ओपी बताता है कि वह पहले से ही समान तरीकों का उपयोग करता है, इसे पोस्ट करने की कोई आवश्यकता नहीं है।
जैकब गनथर

-1

अलेक्जेंडर ओ'मारा का जवाब

सिर्फ नोड कोड स्निपेट जोड़ना

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.