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


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.