জাভাস্ক্রিপ্টে এলোমেলো নম্বর জেনারেটর সিডিং


372

জাভাস্ক্রিপ্টে এলোমেলো সংখ্যা জেনারেটর (ম্যাথ.র্যান্ডম) বীজ দেওয়া সম্ভব?


আপনি এটি বীজ করতে চান কিনা তা পরিষ্কার নয় যাতে আপনি বিভিন্ন পরীক্ষার রানের জন্য বারবার একই ফলাফল পান বা ব্যবহারের মধ্যে আরও ভাল এলোমেলোতার জন্য আপনি ব্যবহারকারী হিসাবে 'অনন্য কিছু' দিয়ে বীজ বানাতে চান কিনা।
simbo1905

2
না, দুর্ভাগ্যক্রমে এটি সম্ভব নয়। আমার যখন বীজযুক্ত পিআরএনজি প্রয়োজন তখন jsrand একটি ছোট লাইব্রেরি wrote আরও অন্যান্য জটিল গ্রন্থাগার রয়েছে যা আপনি এর জন্য গুগলিং খুঁজে পেতে পারেন।
ডোমেনিকো ডি ফেলিস

4
প্রশ্নটি যুক্ত করে: এটির বীজ না দিয়ে কোনও PRNG অফার করা কীভাবে সম্ভব একটি ভাল ধারণা ?? এর কোন ভাল কারণ আছে কি?
অ্যালান

আরও দেখুন stackoverflow.com/questions/424292
Palimondo

উত্তর:


188

না, এটি নয়, তবে আপনার নিজের জেনারেটরটি লিখতে মোটামুটি সহজ, বা আরও ভাল একটি বিদ্যমান ব্যবহার করুন। চেক আউট: এই সম্পর্কিত প্রশ্ন

এছাড়াও, বীজ সম্পর্কিত আরও তথ্যের জন্য ডেভিড বাউয়ের ব্লগ দেখুন


159

দ্রষ্টব্য: সংক্ষিপ্ততা এবং আপাত কমনীয়তা সত্ত্বেও (বা বরং, এর কারণে), এই অ্যালগরিদমটি এলোমেলোতার দিক থেকে কোনওভাবেই উচ্চ মানের নয়। আরও ভাল ফলাফলের জন্য এই উত্তরে যেমন তালিকাবদ্ধ রয়েছে তাদের সন্ধান করুন ।

(মূলত অন্য উত্তরের মন্তব্যে উপস্থাপিত একটি চতুর ধারণা থেকে অভিযোজিত))

var seed = 1;
function random() {
    var x = Math.sin(seed++) * 10000;
    return x - Math.floor(x);
}

আপনি সেট করতে পারেন seed যে কোনও সংখ্যা হিসাবে করতে , কেবল শূন্য এড়িয়ে চলুন (বা ম্যাথের কোনও একাধিক) avoid

এই সমাধানটির কমনীয়তা, আমার মতে, কোনও "যাদু" সংখ্যার অভাব থেকে আসে (10000 ছাড়াও, যা বিজোড় নিদর্শনগুলি এড়াতে আপনাকে ন্যূনতম সংখ্যার দূরে ফেলে দিতে হবে - 10 , 100 , 1000 মান সহ ফলাফল দেখুন) )। ব্রেভিটিও দুর্দান্ত।

এটি ম্যাথ.আরন্ডম () (2 বা 3 এর একটি ফ্যাক্টর) থেকে কিছুটা ধীরে ধীরে, তবে আমি বিশ্বাস করি এটি জাভাস্ক্রিপ্টে লিখিত অন্য যে কোনও সমাধানের চেয়ে তত দ্রুত।


20
এই আরএনজি জেনারেট নম্বরগুলি যা অভিন্নভাবে বিতরণ করা হয়েছে তা প্রমাণ করার কোনও উপায় আছে? পরীক্ষামূলকভাবে এটি দেখে মনে হচ্ছে: jsfiddle.net/bhrLT
নাথান ব্রেইট

6
6,000,000 অপস / সেকেন্ড বেশ দ্রুত, আমি প্রতি ক্লিকে 3,000,000 ডলারের বেশি উত্পাদন করার পরিকল্পনা করি না। মজা করছি, এটা উজ্জ্বল।
এএমকে

59
-১, এটি মোটেও অভিন্ন নমুনা নয় - এটি 0 এবং 1 এর দিকে যথেষ্ট পক্ষপাতদুষ্ট ( jsfiddle.net/bhrLT/17 দেখুন , যা গুণতে কিছুটা সময় নিতে পারে)। ধারাবাহিক মানগুলি পরস্পর সম্পর্কিত - প্রতি 355 টি মান এবং আরও 710 টিরও বেশি সম্পর্কিত। আরও সাবধানে চিন্তা-ভাবনাযুক্ত কিছু ব্যবহার করুন!
স্পেন্সার নেলসন

37
প্রশ্নটি কোনও ক্রিপ্টোগ্রাফিক সুরক্ষিত এলোমেলো সংখ্যা জেনারেটর তৈরির বিষয়ে নয়, তবে জাভাস্ক্রিপ্টে কাজ করে এমন কিছু, দ্রুত ডেমোগুলির জন্য দরকারী, আমি দ্রুত এবং সাধারণ এমন কিছু নেব যা এই লক্ষ্যে লক্ষ লক্ষ এলোমেলো সংখ্যার চেয়ে ভাল দেখতে বিতরণ দেয়।
জেসন গোয়েমাট

15
সাবধান হও. ম্যাথ.সিন () ক্লায়েন্ট এবং সার্ভারে বিভিন্ন ফলাফল দিতে পারে। আমি উল্কা ব্যবহার করি (ক্লায়েন্ট এবং সার্ভারে জাভাস্ক্রিপ্ট ব্যবহার করে)।
ওবিওয়াহান

145

আমি সরল জাভাস্ক্রিপ্টে বেশ কয়েকটি ভাল, সংক্ষিপ্ত এবং দ্রুত সিউডোরানডম নম্বর জেনারেটর (পিআরএনজি) ফাংশন প্রয়োগ করেছি । এগুলির সকলকে বীজযুক্ত করা যায় এবং ভাল মানের নম্বর দেওয়া যায়।

প্রথমত, আপনার PRNGs সঠিকভাবে আরম্ভ করার জন্য যত্ন নিন। নীচের বেশিরভাগ জেনারেটরের কোনও বিল্ট-ইন বীজ উত্পাদন পদ্ধতি নেই (সরলতার জন্য), তবে পিআরএনজির প্রাথমিক অবস্থা হিসাবে এক বা একাধিক 32-বিট মান গ্রহণ করুন। অনুরূপ বীজ (উদাহরণস্বরূপ 1 এবং 2 এর একটি সাধারণ বীজ) দুর্বল PRNGগুলিতে পারস্পরিক সম্পর্ক সৃষ্টি করতে পারে, ফলস্বরূপ আউটপুটটিতে একই বৈশিষ্ট্য রয়েছে (যেমন এলোমেলোভাবে উত্পন্ন স্তর সমান হয়)। এটি এড়াতে, ভাল বিতরণ করা বীজ দিয়ে পিআরএনজিগুলি শুরু করার পক্ষে অনুশীলন করা ভাল।

ধন্যবাদ, হ্যাশ ফাংশনগুলি ছোট স্ট্রিং থেকে পিআরএনজির জন্য বীজ উত্পন্ন করতে খুব ভাল। একটি ভাল হ্যাশ ফাংশন দুটি স্ট্রিং একইরকম হলেও খুব আলাদা ফলাফল তৈরি করে different এখানে মারমুরহ্যাশ 3 এর মিক্সিং ফাংশন ভিত্তিক একটি উদাহরণ রয়েছে:

function xmur3(str) {
    for(var i = 0, h = 1779033703 ^ str.length; i < str.length; i++)
        h = Math.imul(h ^ str.charCodeAt(i), 3432918353),
        h = h << 13 | h >>> 19;
    return function() {
        h = Math.imul(h ^ h >>> 16, 2246822507);
        h = Math.imul(h ^ h >>> 13, 3266489909);
        return (h ^= h >>> 16) >>> 0;
    }
}

পরবর্তী প্রতিটি কল রিটার্ন ফাংশন এর xmur3একটি নতুন "র্যান্ডম" 32 বিট হ্যাশ একটি PRNG একটি বীজ হিসাবে ব্যবহার করা যেতে মান উৎপন্ন হয়। আপনি এটি কীভাবে ব্যবহার করতে পারেন তা এখানে:

// Create xmur3 state:
var seed = xmur3("apples");
// Output four 32-bit hashes to provide the seed for sfc32.
var rand = sfc32(seed(), seed(), seed(), seed());

// Output one 32-bit hash to provide the seed for mulberry32.
var rand = mulberry32(seed());

// Obtain sequential random numbers like so:
rand();
rand();

বিকল্পভাবে, বীজকে প্যাড করার জন্য কেবল কিছু ডামি ডেটা চয়ন করুন এবং জেনারেটরটিকে কয়েকবার (12-20 পুনরাবৃত্তি) প্রারম্ভিকভাবে প্রাথমিক অবস্থায় ভালভাবে মিশ্রিত করতে। এটি প্রায়শই পিআরএনজিগুলির রেফারেন্স বাস্তবায়নে দেখা যায়, তবে এটি প্রাথমিক রাজ্যের সংখ্যা সীমাবদ্ধ করে না।

var seed = 1337 ^ 0xDEADBEEF; // 32-bit seed with optional XOR value
// Pad seed with Phi, Pi and E.
// https://en.wikipedia.org/wiki/Nothing-up-my-sleeve_number
var rand = sfc32(0x9E3779B9, 0x243F6A88, 0xB7E15162, seed);
for (var i = 0; i < 15; i++) rand();

এই পিআরএনজি ফাংশনের আউটপুট একটি ইতিবাচক 32-বিট সংখ্যা (0 থেকে 2 32 -1) উত্পাদন করে যা পরে Math.random()যদি আপনি এলোমেলো সংখ্যা চান তবে 0-1 (0 সমেত, 1 টি এক্সক্লুসিভ) এর সমতুল্য একটি ভাসমান-পয়েন্ট সংখ্যায় রূপান্তরিত হয় you একটি নির্দিষ্ট পরিসীমা, MDN এই নিবন্ধটি পড়ুন । আপনি যদি কেবল কাঁচা বিট চান তবে কেবল চূড়ান্ত বিভাগের অপারেশনটি সরিয়ে দিন।

আরেকটি বিষয় লক্ষণীয় হ'ল জেএসের সীমাবদ্ধতা। সংখ্যাগুলি কেবলমাত্র 53-বিট রেজোলিউশন পর্যন্ত পুরো পূর্ণসংখ্যা উপস্থাপন করতে পারে। এবং বিটওয়াইজ অপারেশনগুলি ব্যবহার করার সময়, এটি 32 এ কমিয়ে দেওয়া হয়েছে। এটি সি বা সি ++ তে লিখিত অ্যালগরিদমগুলি বাস্তবায়নে অসুবিধা সৃষ্টি করে, যা 64-বিট সংখ্যা ব্যবহার করে। 64-বিট কোড পোর্টিং শিম্স যে দরকার আয়তন বহুলাংশে কর্মক্ষমতা কমে যায়। সরলতা এবং দক্ষতার জন্য, আমি কেবলমাত্র 32-বিট গণিত ব্যবহার করা আলগোরিদিমগুলি বিবেচনা করেছি, কারণ এটি সরাসরি জেএসের সাথে সামঞ্জস্যপূর্ণ।

এখন, জেনারেটর থেকে এগিয়ে। (আমি এখানে উল্লেখ সহ পুরো তালিকা বজায় রেখেছি )


sfc32 (সাধারণ দ্রুত কাউন্টার)

sfc32 হ'ল PractRand এলোমেলো সংখ্যা টেস্টিং স্যুটের অংশ (এটি অবশ্যই পাস করে)। sfc32 এর একটি 128-বিট স্টেট রয়েছে এবং জেএসে খুব দ্রুত।

function sfc32(a, b, c, d) {
    return function() {
      a >>>= 0; b >>>= 0; c >>>= 0; d >>>= 0; 
      var t = (a + b) | 0;
      a = b ^ b >>> 9;
      b = c + (c << 3) | 0;
      c = (c << 21 | c >>> 11);
      d = d + 1 | 0;
      t = t + d | 0;
      c = c + t | 0;
      return (t >>> 0) / 4294967296;
    }
}

Mulberry32

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

function mulberry32(a) {
    return function() {
      var t = a += 0x6D2B79F5;
      t = Math.imul(t ^ t >>> 15, t | 1);
      t ^= t + Math.imul(t ^ t >>> 7, t | 61);
      return ((t ^ t >>> 14) >>> 0) / 4294967296;
    }
}

আমি আপনাকে সুপারিশ করব যদি আপনার কেবল একটি সাধারণ তবে শালীন PRNG দরকার হয় এবং কয়েক বিলিয়ন এলোমেলো সংখ্যার প্রয়োজন নেই ( জন্মদিনের সমস্যাটি দেখুন )।

xoshiro128 **

মে 2018 এর মধ্যে, xoshiro128 ** হলেন জর্শিফ্ট পরিবারের নতুন সদস্য , ভিগনা / ব্ল্যাকম্যান (যিনি ক্রোমে ব্যবহৃত xoroshiroও লিখেছিলেন) by এটি দ্রুততম জেনারেটর যা একটি 128-বিট রাজ্য সরবরাহ করে।

function xoshiro128ss(a, b, c, d) {
    return function() {
        var t = b << 9, r = a * 5; r = (r << 7 | r >>> 25) * 9;
        c ^= a; d ^= b;
        b ^= c; a ^= d; c ^= t;
        d = d << 11 | d >>> 21;
        return (r >>> 0) / 4294967296;
    }
}

লেখকরা দাবি করেছেন যে এটি এলোমেলোভাবে পরীক্ষাগুলি ভালভাবে পাস করেছে ( সতর্কতার সাথেও )। অন্যান্য গবেষকরা উল্লেখ করেছেন যে টেস্টইউ 01-তে (বিশেষত লিনিয়ারকম্প এবং বাইনারিঙ্ক) কিছু পরীক্ষা ব্যর্থ হয়। বাস্তবে, ভাসা ব্যবহার করা হলে (যেমন এই বাস্তবায়ন হিসাবে) সমস্যা সৃষ্টি করা উচিত নয়, তবে কাঁচা কম বিটের উপর নির্ভর করে সমস্যা সৃষ্টি করতে পারে।

জেএসএফ (জেনকিন্স 'স্মল ফাস্ট)

এই JSF বা বব জেনকিন্স (2007), লোক তৈরি দ্বারা 'smallprng' হল ISAAC এবং SpookyHash । এটা তোলে পাসের PractRand পরীক্ষা এবং বেশ দ্রুত হওয়া উচিত, যত দ্রুত এসএফসি হিসেবে নয় যদিও।

function jsf32(a, b, c, d) {
    return function() {
        a |= 0; b |= 0; c |= 0; d |= 0;
        var t = a - (b << 27 | b >>> 5) | 0;
        a = b ^ (c << 17 | c >>> 15);
        b = c + d | 0;
        c = d + t | 0;
        d = a + t | 0;
        return (d >>> 0) / 4294967296;
    }
}

এলসিজি (ওরফে লেহমার / পার্ক-মিলার আরএনজি বা এমসিজি)

এলসিজি অত্যন্ত দ্রুত এবং সহজ, তবে এর এলোমেলো মানের গুণমান এতটাই কম, যেহেতু অন্যায় ব্যবহারের ফলে আপনার প্রোগ্রামটিতে বাগগুলি হতে পারে! যাইহোক, কিছু উত্তর ব্যবহারের পরামর্শ দেওয়ার চেয়ে এটি উল্লেখযোগ্যভাবে ভাল Math.sinবা Math.PI! এটি যদিও ওয়ান-লাইনার, এটি দুর্দান্ত :)।

var LCG=s=>()=>(2**31-1&(s=Math.imul(48271,s)))/2**31;

এই বাস্তবায়নটিকে ন্যূনতম মানক আরএনজি বলা হয় যেমন পার্ক implemented মিলার 1988 এবং 1993 সালে প্রস্তাব করেছিলেন এবং সি ++ 11 হিসাবে প্রয়োগ করেছিলেন minstd_rand। মনে রাখবেন যে রাজ্যটি 31-বিট (31 বিট 2 বিলিয়ন সম্ভাব্য রাজ্য দেয়, 32 বিট দ্বিগুণ দেয়)। এটি এমন এক ধরণের PRNG যা অন্যরা প্রতিস্থাপনের চেষ্টা করছে!

এটি কাজ করবে, তবে আপনার যদি সত্যিই গতির প্রয়োজন হয় না এবং এলোমেলো মানের (যদি যাই হোক এলোমেলো কী?) সম্পর্কে যত্ন না নিলে আমি এটি ব্যবহার করব না। গেম জ্যাম বা ডেমো বা কোনও কিছুর জন্য দুর্দান্ত। এলসিজিগুলি বীজ সংক্রান্তিতে ভোগে, সুতরাং এলসিজির প্রথম ফলাফলটি বাতিল করা ভাল । এবং আপনি যদি এলসিজি ব্যবহারের জন্য জেদ করেন, একটি ইনক্রিমেন্ট মান যুক্ত করা ফলাফলের উন্নতি করতে পারে তবে আরও ভাল বিকল্পের উপস্থিতি সম্ভবত এটি নিরর্থকতার একটি অনুশীলন।

মনে হয় অন্যান্য গুণকরা 32-বিট স্টেট (বাড়ানো রাষ্ট্র-স্থান) সরবরাহ করছেন:

var LCG=s=>()=>(s=Math.imul(741103597,s)>>>0)/2**32;
var LCG=s=>()=>(s=Math.imul(1597334677,s)>>>0)/2**32;

এই এলসিজি মানগুলি হ'ল : পি। এল'কুইয়ার: 30 ম 1997 এর বিভিন্ন আকারের এবং ভাল জাল কাঠামোর লিনিয়ার কগ্রুভেন্সি জেনারেটরগুলির একটি সারণী।


5
এটি একটি আশ্চর্যজনক উত্তর। আমি নিশ্চিত যে এই ফিরে আসবে।
ডেভিডস কানাল

1
আমি বিশ্বাস করি যে আপনি পিয়েরে লিকিয়ারের "টেবিলস অফ লিনিয়ার কগ্রুভেনুয়াল জেনারেটর ..." থেকে উদ্ধৃত মানগুলি জাভাস্ক্রিপ্টে সর্বাধিক পূর্ণসংখ্যার আকার ছাড়িয়ে যেতে পারে। (2 ^ 32-1) * সর্বাধিক বীজ * 741103597 ≈ 3e18, যা জাভাস্ক্রিপ্টের সর্বোচ্চ size 9e15 আকারের আকারের চেয়ে বড়। আমি মনে করি পিয়ের এর বই থেকে নিম্নোক্ত মান নেটিভ সীমার মধ্যে বৃহত্তম সময় থাকে: seed = (seed * 185852 + 1) % 34359738337
লাচমানস্কি

1
@ লাচমানস্কি সত্য, তবে সেগুলি 32-বিট (এবং পার্ক-মিলার 31-বিট) দ্বারা আবদ্ধ। ব্যবহার Math.imulহিসাবে এটি যখন 32 বিট ইন্টিজার উপর সি গুণ ব্যবহার করে এটি would ওভারফ্লো করতে পারবেন। আপনি যা পরামর্শ দিচ্ছেন তা হ'ল জেএসের পূর্ণসংখ্যা স্পেসের সম্পূর্ণ পরিসীমা ব্যবহার করে একটি এলসিজি, যা অন্বেষণ করার জন্য অবশ্যই একটি আকর্ষণীয় ক্ষেত্র। :)
bryc

1
এটা সত্যিই দারুন! আমি কি আপনার এসএফসি 32 কে একটি এলজিপিএল প্রোগ্রামে অনুলিপি করতে পারি?
ব্যবহারকারীর 3434639

4
@ ব্লবার 2 আপনি কী বলতে চাইছেন তা নিশ্চিত নয়, তবে আসল কোডটি এখান থেকে (অন্যদের সাথে): github.com/bryc/code/blob/master/jshash/PRNGs.md । কমপক্ষে একটি সংগ্রহশালার ভিতরে
সংক্ষেপ

39

না, তবে এখানে একটি সাধারণ সিউডোর্যান্ডম জেনারেটর, উইকিপিডিয়া থেকে অভিযোজিত মাল্টিপ্লি-উইথ ক্যারি একটি বাস্তবায়ন (এর পরে অপসারণ করা হয়েছে):

var m_w = 123456789;
var m_z = 987654321;
var mask = 0xffffffff;

// Takes any integer
function seed(i) {
    m_w = (123456789 + i) & mask;
    m_z = (987654321 - i) & mask;
}

// Returns number between 0 (inclusive) and 1.0 (exclusive),
// just like Math.random().
function random()
{
    m_z = (36969 * (m_z & 65535) + (m_z >> 16)) & mask;
    m_w = (18000 * (m_w & 65535) + (m_w >> 16)) & mask;
    var result = ((m_z << 16) + (m_w & 65535)) >>> 0;
    result /= 4294967296;
    return result;
}

সম্পাদনা: নির্দিষ্ট বীজ ফাংশন এটি পুনরায় সেট করে m_z
EDIT2: গুরুতর বাস্তবায়নের ত্রুটিগুলি স্থির করা হয়েছে


3
কেউ কি এর কার্যকারিতাটির জন্য এই ফাংশনটি পরীক্ষা করেছে?
জাস্টিন 3

3
এটি হ'ল মাল্টিপল-উইথ-ক্যারি (এমডাব্লুসি) র্যান্ডম জেনারেটর একটি দীর্ঘ দীর্ঘ সময়ের সাথে। উইকিপিডিয়া র‌্যান্ডম নম্বর জেনারেটর
মাইকেল_শার্ফ

10
seedফাংশন, র্যান্ডম জেনারেটর রিসেট করবেন কারণ mz_zপরিবর্তনশীল যখন পরিবর্তিত হয় random()বলা হয়। অতএব সেট করুন mz_z = 987654321(বা অন্য কোনও মান)seed
মাইকেল_শার্ফ

আমি যখন আমার এলোমেলো রঙের জেনারেটর (এইচএসএল) দিয়ে এটি ব্যবহার করি তখন এটি কেবল সবুজ এবং সায়ান রঙ উত্পন্ন করে। আসল এলোমেলো জেনারেটর সমস্ত রঙ উত্পন্ন করে। সুতরাং, এটি একই নয় বা এটি কাজ করে না।
টমাস কুবেস

@ মিশেল_সার্ফ ১) বীজ পরিবর্তন হয় m_w, না m_z। 2) উভয়ই m_wএবং m_zপূর্ববর্তী মানগুলিতে ভিত্তিক পরিবর্তন করা হয়, সুতরাং এটি ফলাফলকে সংশোধন করে।
ESL

26

অ্যান্টি সিকেরির অ্যালগরিদমটি দুর্দান্ত এবং সংক্ষিপ্ত। আমি প্রথমে একটি পরিবর্তন করেছি যা আপনি জাভাস্ক্রিপ্টের ম্যাথ.র্যান্ডমকে প্রতিস্থাপন করেছেন যখন আপনি ম্যাথ.সিড (গুলি) বলবেন, তবে জেসন মন্তব্য করেছিলেন যে ফাংশনটি ফিরে আসা আরও ভাল হবে:

Math.seed = function(s) {
    return function() {
        s = Math.sin(s) * 10000; return s - Math.floor(s);
    };
};

// usage:
var random1 = Math.seed(42);
var random2 = Math.seed(random1());
Math.random = Math.seed(random2());

এটি আপনাকে জাভাস্ক্রিপ্টে নেই এমন আরও একটি কার্যকারিতা দেয়: একাধিক স্বতন্ত্র এলোমেলো জেনারেটর। এটি একইসাথে গুরুত্বপূর্ণ যদি আপনি একই সময়ে একাধিক পুনরাবৃত্তযোগ্য সিমুলেশনগুলি চলতে চান।


3
আপনি যদি সেটিংসের পরিবর্তে ফাংশনটি ফিরিয়ে দেন Math.randomযা আপনাকে একাধিক স্বাধীন জেনারেটর রাখার অনুমতি দেয়, তাইনা?
জেসন গোয়ামাত

1
যদি যে বিষয়ে আপনাকে যদৃচ্ছতা প্রায় বন্টন উপরে মন্তব্য দেখতে নিশ্চিত করা stackoverflow.com/questions/521295/...
jocull

কীভাবে এর দ্বারা উত্পাদিত এলোমেলো পুনরাবৃত্তি হতে পারে? এটি প্রতিবার নতুন নম্বর দেয়
এসএমইউসমাশাহ

প্রতিটি সময় আপনি Math.seed(42);এটি ফাংশনটি পুনরায় সেট করে, তাই আপনি যদি তা var random = Math.seed(42); random(); random();পান 0.70...তবে 0.38...। যদি আপনি এটি var random = Math.seed(42);আবার কল করে পুনরায় সেট করেন , তবে পরের বার আপনি যখন ফোন করবেন তখন random()আপনি 0.70...আবার পাবেন এবং পরের বার আপনি 0.38...আবার পাবেন।
ওয়ান্ডেড স্টিভেন জোনস

1
দয়া করে এটি ব্যবহার করবেন না। randomনেটিভ জাভাস্ক্রিপ্ট ফাংশন ওভাররাইটের পরিবর্তে স্থানীয় একটি ভেরিয়েবল ব্যবহার করার জন্য দয়া করে সময় নিন । ওভাররাইটিংয়ের Math.randomকারণে জেআইএসটি সংকলক আপনার সমস্ত কোড আনপটিমাইজ করতে পারে।
জ্যাক গিফিন

11

দয়া করে দেখুন পিয়ের এল'ইউকায়ারের কাজ 1980 এর দশকের শেষের দিকে এবং 1990 এর দশকের গোড়ার দিকে ফিরে যাচ্ছে। অন্যরাও আছেন। নিজেরাই (সিউডো) এলোমেলো সংখ্যা জেনারেটর তৈরি করা, আপনি যদি বিশেষজ্ঞ না হন তবে বেশ বিপজ্জনক, কারণ ফলাফলগুলি পরিসংখ্যানগতভাবে এলোমেলোভাবে বা অল্প সময়ের মধ্যে না আসার উচ্চ সম্ভাবনা রয়েছে। পিয়েরি (এবং অন্যান্য) কিছু ভাল (সিউডো) এলোমেলো সংখ্যা জেনারেটর একসাথে রেখেছেন যা কার্যকর করা সহজ। আমি তার একটি এলএফএসআর জেনারেটর ব্যবহার করি।

https://www.iro.umontreal.ca/~lecuyer/myftp/papers/handstat.pdf

ফিল ট্রয়


1
দুর্দান্ত উত্তর, তবে জাভাস্ক্রিপ্টের সাথে সম্পর্কিত নয় :)
নিকোলে ফমিনিহ

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

6

পূর্ববর্তী কয়েকটি উত্তরগুলির সংমিশ্রণ, এটি বীজযোগ্য র্যান্ডম ফাংশন যা আপনি খুঁজছেন:

Math.seed = function(s) {
    var mask = 0xffffffff;
    var m_w  = (123456789 + s) & mask;
    var m_z  = (987654321 - s) & mask;

    return function() {
      m_z = (36969 * (m_z & 65535) + (m_z >>> 16)) & mask;
      m_w = (18000 * (m_w & 65535) + (m_w >>> 16)) & mask;

      var result = ((m_z << 16) + (m_w & 65535)) >>> 0;
      result /= 4294967296;
      return result;
    }
}

var myRandomFunction = Math.seed(1234);
var randomNumber = myRandomFunction();

4
এটি বিভিন্ন বীজের সাথে ক্রমের শুরুতে খুব অনুরূপ ফলাফল তৈরি করে। উদাহরণস্বরূপ, Math.seed(0)()রিটার্ন 0.2322845458984375, এবং Math.seed(1)()রিটার্ন 0.23228873685002327। উভয় m_wএবং m_zবীজ অনুযায়ী পরিবর্তন করা সহায়ক বলে মনে হচ্ছে। var m_w = 987654321 + s; var m_z = 123456789 - s;বিভিন্ন বীজের সাথে প্রথম মানের একটি সুন্দর বিতরণ উত্পাদন করে।
undefined

1
@ আপনি বর্ণিত ইস্যুটি নির্ধারিত হিসাবে শেষ সম্পাদনা হিসাবে স্থির করা হয়েছে, এটি এমডব্লিউসি বাস্তবায়নে একটি বাগ ছিল।
bryc

2020 সালের জানুয়ারী অনুযায়ী এখন দুর্দান্তভাবে কাজ করছেন 0 0 দিয়ে বীজ পান 0.7322976540308446। 1: 0.16818441334180534 সহ 2: 0.6040864314418286, 3: 0.03998844954185188 সহ বীজ। দুজন কেই ধন্যবাদ!
ইউরেকা

3

আপনার নিজের সিউডো এলোমেলো জেনারেটর লিখতে খুব সহজ।

ডেভ স্কোটিসের পরামর্শটি কার্যকর তবে অন্যের নির্দেশ অনুসারে এটি পুরোপুরি সমানভাবে বিতরণ করা হয়নি।

তবে এটি পাপের পূর্ণসংখ্যার যুক্তিগুলির কারণে নয়। এটি কেবলমাত্র পাপের পরিসীমা কারণে, যা একটি বৃত্তের এক-মাত্রিক প্রক্ষেপণ হিসাবে ঘটে। পরিবর্তে আপনি যদি বৃত্তের কোণটি গ্রহণ করেন তবে এটি অভিন্ন হবে।

সুতরাং পাপের পরিবর্তে (এক্স) আরগ (এক্সপ্রেস (আই * এক্স)) / (2 * পিআই) ব্যবহার করুন।

আপনি যদি লিনিয়ার অর্ডারটি পছন্দ না করেন তবে এটি কিছুটা জোর দিয়ে মিশ্রিত করুন। আসল ফ্যাক্টরটি তেমন কিছু যায় আসে না।

এন সিউডো এলোমেলো সংখ্যা তৈরি করতে কোড ব্যবহার করতে পারে:

function psora(k, n) {
  var r = Math.PI * (k ^ n)
  return r - Math.floor(r)
}
n = 42; for(k = 0; k < n; k++) console.log(psora(k, n))

দয়া করে মনে রাখবেন যে রিয়েল এন্ট্রপি প্রয়োজন হলে আপনি ছদ্ম র্যান্ডম সিকোয়েন্সগুলি ব্যবহার করতে পারবেন না।


আমি কোনও বিশেষজ্ঞ নই, তবে ক্রমযুক্ত বীজগুলি একটি ধ্রুবক প্যাটার্ন অনুসরণ করে । রঙিন পিক্সেলগুলি হল = = 0.5। আমি অনুমান করছি যে এটি কেবলমাত্র ব্যাসার্ধের উপর দিয়ে বারবার ঘুরছে?
ব্রাইক


1

Math.randomনা, তবে রান লাইব্রেরি এটি সমাধান করে। এটিতে আপনি কল্পনা করতে পারেন এমন প্রায় সমস্ত বিতরণ রয়েছে এবং বীজযুক্ত এলোমেলো সংখ্যা জেনারেশনকে সমর্থন করে। উদাহরণ:

ran.core.seed(0)
myDist = new ran.Dist.Uniform(0, 1)
samples = myDist.sample(1000)

-1

আমি একটি ফাংশন লিখেছি যা একটি বীজযুক্ত এলোমেলো নম্বর দেয়, এটি ম্যাথ.সিনকে একটি দীর্ঘ এলোমেলো সংখ্যার জন্য ব্যবহার করে এবং সে থেকে সংখ্যা বাছতে বীজ ব্যবহার করে।

ব্যবহার:

seedRandom("k9]:2@", 15)

এটি আপনার বদ্ধ নম্বরটি ফিরিয়ে দেবে প্রথম পরামিতিটি কোনও স্ট্রিংয়ের মান; তোমার বীজ দ্বিতীয় প্যারামিটারটি হ'ল কত অঙ্ক ফিরে আসবে।

     function seedRandom(inputSeed, lengthOfNumber){

           var output = "";
           var seed = inputSeed.toString();
           var newSeed = 0;
           var characterArray = ['0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','y','x','z','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','U','R','S','T','U','V','W','X','Y','Z','!','@','#','$','%','^','&','*','(',')',' ','[','{',']','}','|',';',':',"'",',','<','.','>','/','?','`','~','-','_','=','+'];
           var longNum = "";
           var counter = 0;
           var accumulator = 0;

           for(var i = 0; i < seed.length; i++){
                var a = seed.length - (i+1);
                for(var x = 0; x < characterArray.length; x++){
                     var tempX = x.toString();
                     var lastDigit = tempX.charAt(tempX.length-1);
                     var xOutput = parseInt(lastDigit);
                     addToSeed(characterArray[x], xOutput, a, i); 
                }                  
           }

                function addToSeed(character, value, a, i){
                     if(seed.charAt(i) === character){newSeed = newSeed + value * Math.pow(10, a)}
                }
                newSeed = newSeed.toString();

                var copy = newSeed;
           for(var i=0; i<lengthOfNumber*9; i++){
                newSeed = newSeed + copy;
                var x = Math.sin(20982+(i)) * 10000;
                var y = Math.floor((x - Math.floor(x))*10);
                longNum = longNum + y.toString()
           }

           for(var i=0; i<lengthOfNumber; i++){
                output = output + longNum.charAt(accumulator);
                counter++;
                accumulator = accumulator + parseInt(newSeed.charAt(counter));
           }
           return(output)
      }

1
এটির দ্বারা উত্পাদিত সংখ্যার ক্রমগুলি এলোমেলো সংখ্যার ক্রমগুলির বৈশিষ্ট্যগুলি প্রায় অনুমান করে না। এটির সাথে 15 নম্বর উত্পন্ন করুন এবং ফলস্বরূপ স্ট্রিং প্রায় সর্বদা প্রায় 7 টি দিয়ে শুরু হয় প্রায় কোনও কীর জন্য, উদাহরণস্বরূপ।
গ্যাব্রিয়েল


-6

0 এবং 100 এর মধ্যে একটি সংখ্যার জন্য।

Number.parseInt(Math.floor(Math.random() * 100))

3
প্রশ্নটি এমনভাবে বীজ সম্পর্কে রয়েছে Math.randomযে যখনই Math.randomএকই বীজের সাথে বীজ বপন করা হয়, এটি একই ধারাবাহিক ধারাবাহিক এলোমেলো সংখ্যার উত্পাদন করে। প্রকৃত ব্যবহার / প্রদর্শনের বিষয়ে এই প্রশ্নটি বলা যায় না Math.random
জ্যাক গিফিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.