কেন্দ্রে ফোকাস করে একটি এলোমেলো নম্বর পান


238

1-100 এর মধ্যে একটি এলোমেলো নম্বর পাওয়া এবং ফলাফলগুলি 40-60 সীমার মধ্যে রাখা কি সম্ভব? আমি বোঝাতে চাইছি, এটি খুব কমই এই ব্যাপ্তির বাইরে চলে যাবে তবে আমি চাই এটি মূলত এই সীমার মধ্যেই থাকতে পারে ... জাভাস্ক্রিপ্ট / jQuery দিয়ে কি এটি সম্ভব?

এই মুহূর্তে আমি কেবল বেসিকটি ব্যবহার করছি Math.random() * 100 + 1





20
আমি এই প্রশ্নটি কোথায় যাচ্ছে তা পছন্দ করি তবে আমি মনে করি এটি আরও নির্দিষ্ট হওয়া উচিত। আপনি কি জেড-ডিস্ট্রিবিউশন (ঘণ্টা বক্ররেখা), একটি ত্রিভুজ বিতরণ, বা কোনও ধরণের তৃতীয় বন্টন চান? আমার মতে এই প্রশ্নের উত্তর দেওয়ার জন্য একাধিক সম্ভাবনা রয়েছে।
প্যাট্রিক রবার্টস

12
এটি জাভাস্ক্রিপ্টে করা যেতে পারে তবে অবশ্যই jQuery এর সাথে কিছুই করার নেই ... :)
এ। ওল্ফ

উত্তর:


397

সবচেয়ে সহজ উপায় হ'ল 0-50 থেকে দুটি এলোমেলো সংখ্যা তৈরি করা এবং তাদের একসাথে যুক্ত করা।

এটি 50 এর দিকে বিতরণকে পক্ষপাতিত্ব দেয়, একইভাবে দুটি ডাইস বায়াসি 7 এর দিকে ঘুরিয়ে দেয়।

প্রকৃতপক্ষে, একটি বৃহত সংখ্যক "ডাইস" (যেমন @ ফ্যালকো পরামর্শ দেয়) ব্যবহার করে , আপনি একটি ঘণ্টা-বক্ররেখার আরও কাছাকাছি করতে পারেন:

function weightedRandom(max, numDice) {
    var num = 0;
    for (var i = 0; i < numDice; i++) {
        num += Math.random() * (max/numDice);
    }    
    return num;
}

ওজনযুক্ত এলোমেলো সংখ্যা

জেএসফিডাল: http://jsfiddle.net/797qhcza/1/


12
এটি একটি সহজ এবং দ্রুত সমাধান, যা আরও বেশি সংখ্যক উদাহরণস্বরূপ 4 x (0-25) যোগ করে আরও বেশি করে ওজন করা যায় এবং আপনাকে বিতরণের জন্য একটি দুর্দান্ত ঘণ্টা-বক্ররেখা দেয়!
ফ্যালকো

8
এটি কোডের একটি দুর্দান্ত বিট। আমি মনে করি আমি এটির প্রেমে আছি সহজ, দ্রুত, দক্ষ; দুর্দান্ত উত্তর এই পোস্ট করার জন্য আপনাকে ধন্যবাদ।
ctwheels

14
দুর্দান্ত উত্তর, তবে যদি কেউ এটিকে সাধারণ বিতরণ উত্পন্ন করতে ব্যবহার করতে চায় তবে এটি বেশ অদক্ষ (এবং আপনার পছন্দসই গড় এবং মানক বিচ্যুতি পেতে এটি রূপান্তর করতে হবে)। আরও কার্যকর বিকল্পটি হ'ল বক্স-মুলার রূপান্তর, যা আপনি কিছুটা গণিত জানেন কিনা তা বাস্তবায়ন এবং বুঝতে খুব সহজ।
ব্রেন্ডন

1
@ রাজীশাবন এটি অত্যন্ত স্বজ্ঞাত: ডাই থ্রোয়ের একটি মাত্র সংমিশ্রণ রয়েছে যা 2 টি (কেবলমাত্র সাপের চোখ) যুক্ত করে, তবে এখানে 6 টি পৃথক সংমিশ্রণ রয়েছে যা 7 (6-1, 5-2, 4-3, 3-) পর্যন্ত যুক্ত করে 4, 2-5, 1-6)। আপনি যদি এন-পার্শ্বযুক্ত ডাইসে সাধারণীকরণ করেন তবে শিখরটি সর্বদা N + 1 থাকে।
বার্মার

2
@ রাজীশাবন এলোমেলো ভেরিয়েবলের অধ্যয়ন পরিসংখ্যানের একটি কেন্দ্রীয় অঙ্গ। পাশা বাড়ানোর সাথে সাথে আমরা একটি সাধারণ বিতরণে পৌঁছানোর বিষয়টি হ'ল বিখ্যাত কেন্দ্রীয় সীমাবদ্ধ উপপাদ্য
ব্লুরাজা - ড্যানি পিফ্লুঘুফুট

48

আপনার এখানে কয়েকটি ভাল উত্তর রয়েছে যা নির্দিষ্ট সমাধান দেয়; আমাকে আপনার জন্য সাধারণ সমাধান বর্ণনা করতে দিন। সমস্যা হল:

  • আমার কাছে আরও কম বা কম অভিন্ন বিতরণ করা এলোমেলো সংখ্যার 0 এবং 1 এর মধ্যে উত্স রয়েছে ।
  • আমি এলোমেলো সংখ্যার ক্রম উত্পাদন করতে চাই যা একটি ভিন্ন বিতরণ অনুসরণ করে।

এই সমস্যার সাধারণ সমাধান হ'ল কোয়ান্টাইল ফাংশনটি কাজ করা আপনার পছন্দসই বিতরণের এবং তারপরে আপনার অভিন্ন উত্সের আউটপুটে কোয়ান্টাইল ফাংশনটি প্রয়োগ করা।

সমাংশক ফাংশন বিপরীত এর অবিচ্ছেদ্য আপনার পছন্দসই এর বন্টনের ফাংশনের । বিতরণ ফাংশন হ'ল ফাংশন যেখানে বক্ররেখার একটি অংশের নীচে অঞ্চলটি এলোমেলোভাবে নির্বাচিত আইটেমটি সেই অংশে হওয়ার সম্ভাবনার সমান।

আমি এখানে এটি করার একটি উদাহরণ দিচ্ছি:

http://ericlippert.com/2012/02/21/generating-random-non-uniform-data/

কোডটি সি # তে রয়েছে, তবে নীতিগুলি কোনও ভাষার ক্ষেত্রেই প্রযোজ্য; সমাধানটি জাভাস্ক্রিপ্টের সাথে খাপ খাইয়ে নেওয়া সহজ হওয়া উচিত।


2
আমি এই পদ্ধতির পছন্দ। এটি যুক্ত করতে চাই যে এখানে একটি জাভাস্ক্রিপ্ট লাইব্রেরি রয়েছে যা গাউসীয় (এবং অন্যান্য অ-সাধারণ) বিতরণ উত্পন্ন করে: simjs.com/random.html
ফ্লোরিস

36

সংখ্যার অ্যারে নেওয়া ইত্যাদি কার্যকর নয়। আপনার একটি ম্যাপিং নেওয়া উচিত যা 0 থেকে 100 এর মধ্যে একটি এলোমেলো সংখ্যা এবং আপনার প্রয়োজনীয় বিতরণে মানচিত্র গ্রহণ করবে। সুতরাং আপনার ক্ষেত্রে, আপনি আপনার সীমার মাঝখানে সর্বাধিক মান সহ একটি বিতরণ পেতে পারেন ।f(x)=-(1/25)x2+4x

বিতরণ


2
কী বিতরণ দরকার তা আমরা আসলে জানি না। "প্রধানত 40-60" আমার কাছে বেল-বক্র বোঝায়।
লেফটি

হ্যাঁ আপনি ঠিক বলেছেন, আপনার আরও ভাল ম্যাপিং দরকার হতে পারে তবে তা তুচ্ছ
আইকারাম্বা

3
আমি এটির জন্য আপনার শব্দটি গ্রহণ করব কারণ এটি আমার দক্ষতার ক্ষেত্র নয়। আপনি কি ফাংশন সামঞ্জস্য করতে এবং নতুন বক্ররেখা প্রদর্শন করতে পারেন?
লেফটি

1
@ লিফটি - x0 থেকে 100 এর মধ্যে সরল বেল বক্ররেখা ( এই প্রশ্ন থেকে নেওয়া ):y = (Math.sin(2 * Math.PI * (x/100 - 1/4)) + 1) / 2
স্পিনক্সিক্সএক্স

@ স্পিনএক্সএক্সএক্সএক্স এটি কোনও বেল বাঁক নয়, এটি একটি পাপ বক্ররেখা। একটি বেল বক্ররেখা কখনই এক্স-অক্ষকে স্পর্শ করে না।
ব্লুরাজা - ড্যানি প্লেফুঘুফুট

17

সংখ্যাটি "সীমার বাইরে" যাওয়ার অনুমতি দেওয়ার জন্য আমি "সুযোগ" সেটআপ করার মতো কিছু করতে পারি। এই উদাহরণস্বরূপ, একটি 20% সুযোগ সংখ্যাটি 1-100 হবে, অন্যথায় 40-60:

$(function () {
    $('button').click(function () {
        var outOfBoundsChance = .2;
        var num = 0;
        if (Math.random() <= outOfBoundsChance) {
            num = getRandomInt(1, 100);
        } else {
            num = getRandomInt(40, 60);
        }
        $('#out').text(num);
    });
    
    function getRandomInt(min, max) {
        return Math.floor(Math.random() * (max - min + 1)) + min;
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<button>Generate</button>
<div id="out"></div>

ফিডাল: http://jsfiddle.net/kbv39s9w/


5
সম্ভবত আরও পরিসংখ্যান বিশদ সহ কেউ আমাকে সংশোধন করতে পারে, এবং যদিও এটি ওপি যা সন্ধান করছে তা অর্জন করে (তাই আমি ভোট দিয়েছি), তবে এটি সত্যিকারের 20% সীমা ছাড়িয়ে একটি # বেছে নিবে না, সঠিক? এই সমাধানটিতে, আপনার 20% সময় তখন 1-100 থেকে একটি # চয়ন করার সুযোগ পাবে, যার মধ্যে 40-60 রয়েছে। এটি কি আসলে (0.2 * 0.8) 16% সীমা ছাড়িয়ে একটি # বাছাই করতে হবে না, বা আমি কিছু মিস করছি?
জোশ

না, আপনি ঠিক বলেছেন। এটা শুধু আমার শব্দ। আমি এটি সংশোধন করব। ধন্যবাদ!
বিটওয়াইজ ক্রিয়েটিভ

1
@ জোশ - এটি বেশ সুন্দর on Jsfiddle.net/v51z8sd5 এর মতো দেখতে এটির একটি সহজ প্রমাণ । এটি 0.16 (16%) এর কাছাকাছি থাকা এবং গেমগুলির বাইরে থাকা সংখ্যার শতাংশ দেখায়।
ট্র্যাভিস জে

15

আমার কয়েক বছর আগে এই সমস্যাটি সমাধান করা দরকার এবং আমার সমাধান অন্যান্য উত্তরের চেয়ে সহজ ছিল।

আমি সীমানার মধ্যে 3 টি র্যান্ডম তৈরি করেছি এবং সেগুলি গড় করেছি। এটি ফলাফলটিকে কেন্দ্রের দিকে টানে কিন্তু চূড়ায় পৌঁছানো সম্পূর্ণরূপে ছেড়ে দেয়।


7
এটি কীভাবে নীলরাজের উত্তরের চেয়ে ভাল / আলাদা? সেখানে, তিনি এলোমেলো সংখ্যার (2,3, ... আপনি যে কোনও সংখ্যার) যোগফল নিয়ে যান এবং গড় নেন। ফলাফলটি আপনার কাছে অভিন্ন যখন আপনি BellFactor3 এর 3 ব্যবহার করেন
ফ্লোরিস

@ ফ্লোরিস ভাল, আমি ভাষার সি পরিবারে কোড করি না যাতে উত্তরটি দেখে মনে হয় না যদিও এটি আমার উত্তর হিসাবে একইভাবে কাজ করছে যতক্ষণ না আমি এখনই এটি পুনরায় পাঠ করি। আমি আমার পদ্ধতিটি কিছুটা পরীক্ষামূলক-ত্রুটির মাধ্যমে তৈরি করেছি এবং দেখতে পেয়েছি যে 3 টি এলোমেলো সঠিক সংখ্যা। এছাড়াও, খনিটি এক লাইনে করা যায় এবং তবুও বোঝা সহজ।
লেফটি

2
সত্যি? আপনি কী ভাবেন না যে জেএস এবং সি এর মধ্যে কোনও মিল আছে? ঠিক আছে, ঠিক আছে, কেবলমাত্র আমি বলতে পারি যে আমি সেসব ভাষাতে আর কথা বলতে পারি না, বা জাভা, যা আমার কাছে, সমস্ত ভাষা যেগুলির সাথে আমি পরিচিত তার তুলনায় similar
লেফটি

1
সুস্পষ্ট পয়েন্ট, আমি আসলে নিজেকেই সমাধান করেছি এমন কিছু হিসাবে আমি কেবল শিরোনাম দ্বারা আকৃষ্ট হয়েছিল এবং আমি যেভাবে এটি করেছি তাতে বেশ গর্বিত। আবার, আমি সচেতন ছিলাম না যতক্ষণ না আপনি ঠিক বলেছেন said সত্যিই ভাগ্যবান, কারণ আমার কৌশলটি ভাষা নির্ভর নয় এবং কিছু লোক মনে হয় এটি একটি দরকারী উত্তর।
লেফটি

5
জাভাস্ক্রিপ্ট আসলে হয় একটি সি-পরিবার ভাষা ভাল ... কিন্তু অই।
জোরেেন

14

এটা তোলে দেখায় মূঢ় কিন্তু আপনি রান্ড দুইবার ব্যবহার করতে পারেন:

var choice = Math.random() * 3;
var result;

if (choice < 2){
    result = Math.random() * 20 + 40; //you have 2/3 chance to go there
}
else {
    result = Math.random() * 100 + 1;
}

11

অবশ্যই এটি সম্ভব। 1-100 এলোমেলো করুন। যদি নম্বরটি <30 হয় তবে 40-160 রেঞ্জে জেনারেট না হলে 1-100 রেঞ্জের মধ্যে নম্বর তৈরি করুন।


11

এ জাতীয় এলোমেলো সংখ্যা উত্পন্ন করার বিভিন্ন উপায় রয়েছে। এটি করার একটি উপায় হ'ল একাধিক অভিন্ন র্যান্ডম সংখ্যার যোগফল গণনা করা। আপনি কতগুলি এলোমেলো সংখ্যার যোগফল এবং তাদের পরিসর কত তা চূড়ান্ত বিতরণটি কেমন হবে তা নির্ধারণ করবে।

আপনি যত বেশি সংখ্যায় যোগ করবেন, ততই এটি কেন্দ্রের দিকে পক্ষপাতদুষ্ট হবে। ব্যবহার 1 র্যান্ডম সংখ্যা এর সমষ্টি ইতিমধ্যে আপনার প্রশ্নের প্রস্তাব করা হয়, কিন্তু হিসাবে আপনি লক্ষ্য পরিসীমা কেন্দ্রের দিকে পক্ষপাতমূলক নয়। অন্যান্য উত্তরে 2 টি এলোমেলো সংখ্যার যোগফল বা 3 টি এলোমেলো সংখ্যার যোগফল ব্যবহারের প্রস্তাব দেওয়া হয়েছে

আরও এলোমেলো সংখ্যার যোগফল নিয়ে আপনি রেঞ্জের কেন্দ্রের দিকে আরও পক্ষপাত পেতে পারেন। চূড়ান্তভাবে আপনি 99 টি এলোমেলো সংখ্যার যোগফল নিতে পারেন যা প্রতিটি হয় 0 বা 1। এটি দ্বিপদী বিতরণ হবে। (দ্বিপদী বিতরণগুলি কিছুটা অর্থে সাধারণ বিতরণের আলাদা সংস্করণ হিসাবে দেখা যায়)। এটি তত্ত্বে এখনও পুরো পরিসীমাটিকে কভার করতে পারে তবে এটি কেন্দ্রের দিকে এতটা পক্ষপাতদুষ্ট রয়েছে যে এটি কখনই শেষ প্রান্তে পৌঁছানোর আশা করা উচিত নয়।

এই পদ্ধতির অর্থ আপনি কতটা পক্ষপাতিত্ব চান তা আপনি টুইট করতে পারেন।


8

এই জাতীয় কিছু ব্যবহার সম্পর্কে:

var loops = 10;
var tries = 10;
var div = $("#results").html(random());
function random() {
    var values = "";
    for(var i=0; i < loops; i++) {
        var numTries = tries;
        do {
            var num = Math.floor((Math.random() * 100) + 1);
            numTries--;
        }
        while((num < 40 || num >60) && numTries > 1)
        values += num + "<br/>";
    }
    return values;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="results"></div>

আমি যেভাবে কোডিং করেছি সেটি আপনাকে বেশ কয়েকটি ভেরিয়েবল সেট করার অনুমতি দেয়:
লুপস = ফলাফলের সংখ্যা
চেষ্টা করে সংখ্যা = ফাংশনটি 40-60 এর মধ্যে একটি সংখ্যা পাওয়ার চেষ্টা করবে যতক্ষণ না এটি লুপটির মধ্য দিয়ে চলতে শুরু করে

যুক্ত বোনাস: এটি যখন ব্যবহার করে !!! দারুণভাবে দুর্দান্ত


8

আপনি একটি ফাংশন যা মধ্যবর্তী র্যান্ডম মান মানচিত্র লিখতে পারেন [0, 1)করার [1, 100]ওজন অনুযায়ী। এই উদাহরণ বিবেচনা করুন:

0.01.0 থেকে 1-100 শতাংশ ওজন দ্বারা

এখানে, মান 0.95মানচিত্রের মধ্যে মান [61, 100]
আসলে আমাদের আছে .05 / .1 = 0.5, যা ম্যাপ করা হয় [61, 100], ফলন81

ফাংশনটি এখানে:

/*
 * Function that returns a function that maps random number to value according to map of probability
 */
function createDistributionFunction(data) {
  // cache data + some pre-calculations
  var cache = [];
  var i;
  for (i = 0; i < data.length; i++) {
    cache[i] = {};
    cache[i].valueMin = data[i].values[0];
    cache[i].valueMax = data[i].values[1];
    cache[i].rangeMin = i === 0 ? 0 : cache[i - 1].rangeMax;
    cache[i].rangeMax = cache[i].rangeMin + data[i].weight;
  }
  return function(random) {
    var value;
    for (i = 0; i < cache.length; i++) {
      // this maps random number to the bracket and the value inside that bracket
      if (cache[i].rangeMin <= random && random < cache[i].rangeMax) {
        value = (random - cache[i].rangeMin) / (cache[i].rangeMax - cache[i].rangeMin);
        value *= cache[i].valueMax - cache[i].valueMin + 1;
        value += cache[i].valueMin;
        return Math.floor(value);
      }
    }
  };
}

/*
 * Example usage
 */
var distributionFunction = createDistributionFunction([
  { weight: 0.1, values: [1, 40] },
  { weight: 0.8, values: [41, 60] },
  { weight: 0.1, values: [61, 100] }
]);

/*
 * Test the example and draw results using Google charts API
 */
function testAndDrawResult() {
  var counts = [];
  var i;
  var value;
  // run the function in a loop and count the number of occurrences of each value
  for (i = 0; i < 10000; i++) {
    value = distributionFunction(Math.random());
    counts[value] = (counts[value] || 0) + 1;
  }
  // convert results to datatable and display
  var data = new google.visualization.DataTable();
  data.addColumn("number", "Value");
  data.addColumn("number", "Count");
  for (value = 0; value < counts.length; value++) {
    if (counts[value] !== undefined) {
      data.addRow([value, counts[value]]);
    }
  }
  var chart = new google.visualization.ColumnChart(document.getElementById("chart"));
  chart.draw(data);
}
google.load("visualization", "1", { packages: ["corechart"] });
google.setOnLoadCallback(testAndDrawResult);
<script src="https://www.google.com/jsapi"></script>
<div id="chart"></div>


7

এখানে 3/4 40-60 এবং 1/4 এর সীমার বাইরে একটি ওজনযুক্ত সমাধান।

function weighted() {

  var w = 4;

  // number 1 to w
  var r = Math.floor(Math.random() * w) + 1;

  if (r === 1) { // 1/w goes to outside 40-60
    var n = Math.floor(Math.random() * 80) + 1;
    if (n >= 40 && n <= 60) n += 40;
    return n
  }
  // w-1/w goes to 40-60 range.
  return Math.floor(Math.random() * 21) + 40;
}

function test() {
  var counts = [];

  for (var i = 0; i < 2000; i++) {
    var n = weighted();
    if (!counts[n]) counts[n] = 0;
    counts[n] ++;
  }
  var output = document.getElementById('output');
  var o = "";
  for (var i = 1; i <= 100; i++) {
    o += i + " - " + (counts[i] | 0) + "\n";
  }
  output.innerHTML = o;
}

test();
<pre id="output"></pre>


6

ঠিক আছে, তাই আমি অন্য উত্তর যুক্ত করার সিদ্ধান্ত নিয়েছি কারণ আমার শেষ উত্তরটি যেমন মনে হয়েছিল, তেমনি বেশিরভাগ উত্তর এখানেও বেল-বক্রাকার ধরণের ফলাফলের রিটার্ন পাওয়ার জন্য কিছুটা অর্ধ-পরিসংখ্যানমূলক পদ্ধতি ব্যবহার করুন। আমি নীচে প্রদত্ত কোডটি আপনি যখন পাশা চালাচ্ছেন ঠিক তেমনভাবে কাজ করে। সুতরাং, 1 বা 99 পাওয়া সবচেয়ে কঠিন তবে 50 পাওয়া সহজ get

var loops = 10; //Number of numbers generated
var min = 1,
    max = 50;
var div = $("#results").html(random());

function random() {
    var values = "";
    for (var i = 0; i < loops; i++) {
        var one = generate();
        var two = generate();
        var ans = one + two - 1;
        var num = values += ans + "<br/>";
    }
    return values;
}

function generate() {
    return Math.floor((Math.random() * (max - min + 1)) + min);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div id="results"></div>


6

আমি বিটা বিতরণ ব্যবহার করার পরামর্শ দেব 0-1-এর মধ্যে একটি সংখ্যা তৈরি করতে , তারপরে এটি বাড়িয়ে দিন। এটি বেশ নমনীয় এবং বিতরণের বিভিন্ন আকার তৈরি করতে পারে।

এখানে একটি দ্রুত এবং নোংরা নমুনা:

rbeta = function(alpha, beta) {
 var a = 0   
 for(var i = 0; i < alpha; i++)   
    a -= Math.log(Math.random())

 var b = 0   
 for(var i = 0; i < beta; i++)   
    b -= Math.log(Math.random())

  return Math.ceil(100 * a / (a+b))
}

5
var randNum;
// generate random number from 1-5
var freq = Math.floor(Math.random() * (6 - 1) + 1);
// focus on 40-60 if the number is odd (1,3, or 5)
// this should happen %60 of the time
if (freq % 2){
    randNum = Math.floor(Math.random() * (60 - 40) + 40);
}
else {
    randNum = Math.floor(Math.random() * (100 - 1) + 1);
}

5

এই খুব সমস্যার জন্য সবচেয়ে ভাল সমাধানটি হ'ল ব্লু রাজা প্রস্তাবিত একটি - ড্যানি প্লেফুঘুফুট তবে আমি মনে করি কিছুটা দ্রুত এবং আরও সাধারণ সমাধানও উল্লেখ করার মতো।


যখন আমাকে দুটি প্রয়োজনীয়তা সন্তুষ্ট করে এলোমেলো সংখ্যার (স্ট্রিংগুলি, সমন্বয়যুক্ত জোড়া ইত্যাদি) তৈরি করতে হয়

  1. ফলাফল সেটটি বেশ ছোট। (16 কে সংখ্যার চেয়ে বড় নয়)
  2. ফলাফল সেট বিচক্ষণ। (শুধুমাত্র পূর্ণসংখ্যার সংখ্যাগুলির মতো)

আমি সাধারণত সংখ্যার একটি অ্যারে তৈরি করে শুরু করি (স্ট্রিংগুলি, সমন্বয়যুক্ত জোড়া ইত্যাদি) প্রয়োজনীয়তা পূরণ করে (আপনার ক্ষেত্রে: একাধিকবার আরও বেশি সম্ভাব্য সংখ্যার একটি অ্যারে) numbers, তারপরে সেই অ্যারের একটি এলোমেলো আইটেমটি চয়ন করুন choose এইভাবে, আপনাকে কেবল প্রতি আইটেম একবার ব্যয়বহুল এলোমেলো ফাংশন কল করতে হবে।


1
আপনি যদি পছন্দগুলির একটি অ্যারে প্রিফিল করতে চলেছেন তবে আপনি পরে সেগুলি এলোমেলোও করতে পারেন। তারপরে আপনি রান আউট না হওয়া অবধি কেবল সেগুলি ধরে ফেলতে পারেন। আবার তালিকাভুক্ত হলে / যখন আপনি তালিকার শেষের দিকে আঘাত করবেন তখন আবার শাফল করুন।
জিওবিটস

@ জিওবিটস একটি তালিকা বদলানো এলোমেলোভাবে এর উপাদানগুলির মধ্যে একটি বেছে নেওয়ার চেয়ে অনেক বেশি সংস্থান-নিবিড় কাজ। তালিকাটি অনুমানযোগ্য হতে হয় তবে এটি কেবলমাত্র একটি ভাল পছন্দ।
এমজি

1
তবে আপনি তালিকার প্রতিটি চক্রের পরিবর্তে একবারে একবার এটি করেন। যদি আপনি এটি প্রিপ্রোসেস করেন (যেহেতু আপনার যে কোনও উপায়ে প্রিপ্রোসেসিং পদক্ষেপ রয়েছে তাই আমি ধরে নিই যে এটি ভাল) তবে তারপরে প্রতিটি নম্বর পাওয়া খুব দ্রুত fast আপনি যখনই সময় কম করবেন তখনই আপনি রদবদল করতে পারেন, বা জানেন যে আপনাকে কিছুটা হলেও এলোমেলো সংখ্যার প্রয়োজন হবে না। কেবল এটি বিকল্প হিসাবে অফার করা, উভয়েরই (ডিস্ক) সুবিধা রয়েছে।
জিওবিটস

@ জিওবিটস যদি আপনি এটি নিজের উপায়ে করেন তবে "একক সম্ভাবনা" সংখ্যাগুলি "ছিটকে যাবে" এবং পুনর্বিবেচনা হওয়া পর্যন্ত তারা ফলাফল হিসাবে আসতে পারে না। (উদাহরণস্বরূপ, আপনি যদি দুটি ডাইস নিক্ষেপ করার অনুকরণ করেন তবে আপনার কাছে দ্বিগুণের চেয়ে 2 নম্বর বেশি পাওয়ার সামান্যতম
সুযোগও

1
এটা একটা ব্যাপার অনেক ); তাই না ব্যবহার করার বিরল অ্যাপ্লিকেশন যেখানে যে ঠিক আছে ছাড়া ভাল কারণ
Geobits

4

বিতরণ

 5% for [ 0,39]
90% for [40,59]
 5% for [60,99]

সমাধান

var f = Math.random();
if (f < 0.05) return random(0,39);
else if (f < 0.95) return random(40,59);
else return random(60,99);

জেনেরিক সমাধান

random_choose([series(0,39),series(40,59),series(60,99)],[0.05,0.90,0.05]);

function random_choose (collections,probabilities)
{
    var acc = 0.00;
    var r1 = Math.random();
    var r2 = Math.random();

    for (var i = 0; i < probabilities.length; i++)
    {
      acc += probabilities[i];
      if (r1 < acc)
        return collections[i][Math.floor(r2*collections[i].length)];
    }

    return (-1);
}

function series(min,max)
{
    var i = min; var s = [];
    while (s[s.length-1] < max) s[s.length]=i++;
    return s;
}

4

40-60 বা 1-100 এ এলোমেলো সংখ্যা উত্পন্ন করা যায় কিনা তা আপনি একটি সহায়ক র্যান্ডম নম্বর ব্যবহার করতে পারেন:

// 90% of random numbers should be between 40 to 60.
var weight_percentage = 90;

var focuse_on_center = ( (Math.random() * 100) < weight_percentage );

if(focuse_on_center)
{
	// generate a random number within the 40-60 range.
	alert (40 + Math.random() * 20 + 1);
}
else
{
	// generate a random number within the 1-100 range.
	alert (Math.random() * 100 + 1);
}


4

আপনি যদি gaussianফাংশনটি ব্যবহার করতে পারেন তবে এটি ব্যবহার করুন। এই ফাংশনটি সহ average 0এবং সাধারণ সংখ্যাটি দেয়sigma 1

এই সংখ্যার 95% এর মধ্যে average +/- 2*sigma। আপনার average = 50, এবং sigma = 5তাই

randomNumber = 50 + 5*gaussian()

3

এটি করার সর্বোত্তম উপায় হ'ল একটি এলোমেলো সংখ্যা তৈরি করা যা নির্দিষ্ট সংখ্যায় সমানভাবে বিতরণ করা হয় এবং তারপরে 0 এবং 100 এর মধ্যে সেটে একটি প্রজেকশন ফাংশন প্রয়োগ করুন যেখানে প্রজেকশনটি আপনার পছন্দের সংখ্যাগুলিতে হিট হওয়ার সম্ভাবনা বেশি।

সাধারণত এটি অর্জনের গাণিতিক পদ্ধতিটি আপনি চান সংখ্যার সম্ভাব্যতা ফাংশন প্লট করে। আমরা ঘন্টার বক্ররেখাটি ব্যবহার করতে পারি, তবে আসুন সহজ গণনার স্বার্থে কেবল একটি ফ্লিপড প্যারোবোলার সাথে কাজ করি।

আসুন একটি প্যারাবোলা তৈরি করুন যাতে এর শিকড়গুলি এটি স্কাইنگ ছাড়াই 0 এবং 100 এ থাকে। আমরা নিম্নলিখিত সমীকরণ পেতে:

f(x) = -(x-0)(x-100) = -x * (x-100) = -x^2 + 100x

এখন, 0 এবং 100 এর মধ্যে বক্ররেখার সমস্ত অঞ্চল আমাদের প্রথম সেটটির প্রতিনিধি যেখানে আমরা সংখ্যাটি উত্পন্ন করতে চাই। সেখানে, প্রজন্ম সম্পূর্ণ এলোমেলো। সুতরাং, আমাদের যা করতে হবে তা হ'ল আমাদের প্রথম সেটটির সীমা find

নিম্ন সীমাটি অবশ্যই, 0, উপরের বাউন্ডটি 100 এ আমাদের ফাংশনের অবিচ্ছেদ্য, যা হয়

F(x) = -x^3/3 + 50x^2
F(100) = 500,000/3 = 166,666.66666 (let's just use 166,666, because rounding up would make the target out of bounds)

সুতরাং আমরা জানি যে আমাদের কোথাও 0 এবং 166,666 এর মধ্যে একটি সংখ্যা তৈরি করতে হবে। তারপরে, আমাদের কেবল সেই সংখ্যাটি নেওয়া এবং এটি আমাদের দ্বিতীয় সেটে প্রজেক্ট করা দরকার, যা 0 এবং 100 এর মধ্যে রয়েছে।

আমরা জানি যে এলোমেলো সংখ্যাটি আমরা তৈরি করেছি তা আমাদের প্যারোবোলার কিছু অবিচ্ছেদ্য x এবং 100 এর মধ্যে ইনপুট রয়েছে That এর অর্থ আমাদের সহজেই ধরে নিতে হবে যে এলোমেলো সংখ্যাটি F (x) এর ফলাফল, এবং x এর জন্য সমাধান।

এই ক্ষেত্রে, এফ (এক্স) একটি ঘন সমীকরণ, এবং আকারে F(x) = ax^3 + bx^2 + cx + d = 0নিম্নলিখিত বিবৃতিগুলি সত্য:

a = -1/3
b = 50
c = 0
d = -1 * (your random number)

এক্স এর জন্য এটি সমাধান করলে আপনি যে প্রকৃত র্যান্ডম সংখ্যাটি সন্ধান করছেন তাতে ফল পাওয়া যায়, যা [0, 100] পরিসরে থাকার গ্যারান্টিযুক্ত এবং প্রান্তগুলির চেয়ে কেন্দ্রের কাছাকাছি হওয়ার অনেক বেশি সম্ভাবনা রয়েছে।


3

এই উত্তর সত্যিই ভাল । তবে আমি বাস্তব পরিস্থিতির জন্য পোস্টগুলি পোস্ট করতে চাই (আমি জাভাস্ক্রিপ্টে নেই, তাই আমি আশা করি আপনি বুঝতে পারবেন) বিভিন্ন পরিস্থিতির জন্য।


ধরুন আপনার কাছে প্রতিটি ব্যাপ্তির জন্য ব্যাপ্তি এবং ওজন রয়েছে:

ranges - [1, 20], [21, 40], [41, 60], [61, 100]
weights - {1, 2, 100, 5}

প্রাথমিক স্ট্যাটিক তথ্য, ক্যাশে করা যেতে পারে:

  1. সমস্ত ওজনের যোগফল (নমুনায় 108)
  2. ব্যাপ্তি নির্বাচনের সীমানা। এটি মূলত এই সূত্র: Boundary[n] = Boundary[n - 1] + weigh[n - 1]এবং Boundary[0] = 0। নমুনা আছেBoundary = {0, 1, 3, 103, 108}

সংখ্যা উত্পাদন:

  1. Nপরিসীমা থেকে এলোমেলো সংখ্যা তৈরি করুন [0, সমস্ত ওজনের যোগফল)।
  2. for (i = 0; i < size(Boundary) && N > Boundary[i + 1]; ++i)
  3. iব্যাপ্তিটি ধরুন এবং সেই ব্যাপ্তিতে এলোমেলো সংখ্যা তৈরি করুন।

কর্মক্ষমতা অনুকূলকরণের জন্য অতিরিক্ত নোট for রেঞ্জগুলি আরোহী বা অবতরণ ক্রমকে অর্ডার করতে হবে না, সুতরাং দ্রুততম পরিসরের বর্ণন আপ সীমাটির জন্য সর্বোচ্চ ওজন থাকা প্রথমে উচিত এবং সর্বনিম্ন ওজনের একটি শেষ হওয়া উচিত।

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