জেএস এলোমেলো বুলিয়ান উত্পন্ন করে


134

সাধারণ প্রশ্ন, তবে আমি এখানে সূক্ষ্ম আগ্রহী।

আমি নীচের পদ্ধতিটি ব্যবহার করে এলোমেলো বুলেটিন উত্পন্ন করছি আমি নিজের সাথে এসেছি:

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

যখনই random()প্রদর্শিত হবে, মনে হয় সবসময়ই কোনও সমস্যা হয় - এটি সত্যই এলোমেলো নয়, এটি অন্য কোনও কিছুর দ্বারা আপোস করা হয়েছে So সুতরাং, আমি জানতে চাই:

ক) উপরেরটি কি এটি করার সর্বোত্তম অনুশীলনের উপায়?

খ) আমি কি বিষয়গুলিকে অতিরিক্ত বিবেচনা করছি?

গ) আমি কি বিষয়গুলিকে গুরুত্ব দিচ্ছি?

d) আমি জানি না এমন আরও ভাল / দ্রুত / মার্জিত-উপায় আছে কি?

(এছাড়াও বি এবং সি পারস্পরিক একচেটিয়া থাকলে কিছুটা আগ্রহী))

হালনাগাদ

যদি এটি কোনও পার্থক্য করে, আমি এআই চরিত্রের চলাচলের জন্য এটি ব্যবহার করছি।


25
const rand = Math.random() < 0.5সমতুল্য এবং সহজ।
— হামস

3
আপনি কেবল ছদ্মবেশীতা অর্জন করতে পারেন , সত্যিকারের এলোমেলোতা নয় not
— ওরিওল

কিছুই আসলে এলোমেলো নয়, লক্ষ্যটি যতটা সম্ভব এলোমেলোভাবে কাছাকাছি পৌঁছানো।
— অ্যাডাম বুচানান স্মিথ

এবং আপনার যদি 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 এ পরিবর্তন করেন। তারপরে, সম্ভাবনাটি পরিবর্তিত হওয়ার সম্ভাবনা রয়েছে। আমি মনে করি আপনি এটি 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অবজেক্টটি একটি ডিওএম এপিআই, সুতরাং এটি নোডে উপলভ্য নয় তবে নোডের জন্য অনুরূপ এপিআই রয়েছে ।


4
Math.random()বেশিরভাগ ক্ষেত্রে কুখ্যাতভাবে এলোমেলো, দুর্দান্ত বিকল্প পরামর্শ
— চার্লস হ্যারিস

3
আমি এখানে একটি ছোট সংশোধন করতে যাচ্ছি, যেহেতু আমি আবিষ্কার করেছি যে এটি 50,000 000 রানের পরে গড়ে এটি গড়ে 0.78% বা আরও বেশি শূন্য রয়েছে: ফিরে আসুন [0] <= 127; (অন্য 127 কখনও অন্তর্ভুক্ত করা হয় না)
— Amund Midtskog

2
@ আমন্ডমিটসকোগ ভাল কল। আমার টাইপ করা উচিত ছিল:a[0] > 127
— আলেকজান্ডার ও'মারা

1
যাইহোক, আপনি সাধারণত কেবল 255 এর চেয়ে অনেক বেশি সংখ্যক নমুনা তৈরি করতে চাইতে পারেন Rather বরং, ডেটাতে গোলমাল হ্রাস করার জন্য, 100,000 - বা এমনকি কয়েক মিলিয়ন এর মতো কিছু, অন্য মন্তব্যে যেমন পরামর্শ দেওয়া হয়েছে, আপনি 0.78% এর চেয়ে ছোট ত্রুটি দেখতে চান।
— কাও

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

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


6
দয়া করে এটিকে আরও সহায়তার সাথে ফর্ম্যাট করুন ( স্ট্যাকওভারফ্লো.com / এডিটিং- হেল্প ) এবং কিছু ব্যাখ্যা যুক্ত করুন। কেবলমাত্র কোডের উত্তরগুলি খুব বেশি প্রশংসা হয় না। একটি ব্যাখ্যা যুক্ত করা এই ভুল ধারণাটিকে লড়াই করতে সহায়তা করবে যে স্ট্যাকওভারফ্লো একটি নিখরচায় কোড-লেখার পরিষেবা।
— Yunnosch

5

কেলভিনের উত্তর দ্বারা অনেকটা মুগ্ধ হয়েছিল আমি মোটামুটি অনুরূপ তবে কিছুটা বর্ধিত সমাধানের পরামর্শ দিতে চাই।

var randomBoolean = Math.random() < 0.5;

এই সমাধানটি পড়ার জন্য আরও কিছুটা সুস্পষ্ট, কারণ ডানদিকে ডানদিকে থাকা সংখ্যাটি <পাওয়ার trueপরিবর্তে পাওয়ার সম্ভাবনাটি বলে দেয় falseযা বোঝা আরও স্বাভাবিক। এর <চেয়ে কম একটি প্রতীকও রয়েছে >=;



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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.