জাভাস্ক্রিপ্টে এলোমেলো সংখ্যা জেনারেটর (ম্যাথ.র্যান্ডম) বীজ দেওয়া সম্ভব?
জাভাস্ক্রিপ্টে এলোমেলো সংখ্যা জেনারেটর (ম্যাথ.র্যান্ডম) বীজ দেওয়া সম্ভব?
উত্তর:
না, এটি নয়, তবে আপনার নিজের জেনারেটরটি লিখতে মোটামুটি সহজ, বা আরও ভাল একটি বিদ্যমান ব্যবহার করুন। চেক আউট: এই সম্পর্কিত প্রশ্ন ।
এছাড়াও, বীজ সম্পর্কিত আরও তথ্যের জন্য ডেভিড বাউয়ের ব্লগ দেখুন ।
দ্রষ্টব্য: সংক্ষিপ্ততা এবং আপাত কমনীয়তা সত্ত্বেও (বা বরং, এর কারণে), এই অ্যালগরিদমটি এলোমেলোতার দিক থেকে কোনওভাবেই উচ্চ মানের নয়। আরও ভাল ফলাফলের জন্য এই উত্তরে যেমন তালিকাবদ্ধ রয়েছে তাদের সন্ধান করুন ।
(মূলত অন্য উত্তরের মন্তব্যে উপস্থাপিত একটি চতুর ধারণা থেকে অভিযোজিত))
var seed = 1;
function random() {
var x = Math.sin(seed++) * 10000;
return x - Math.floor(x);
}
আপনি সেট করতে পারেন seed
যে কোনও সংখ্যা হিসাবে করতে , কেবল শূন্য এড়িয়ে চলুন (বা ম্যাথের কোনও একাধিক) avoid
এই সমাধানটির কমনীয়তা, আমার মতে, কোনও "যাদু" সংখ্যার অভাব থেকে আসে (10000 ছাড়াও, যা বিজোড় নিদর্শনগুলি এড়াতে আপনাকে ন্যূনতম সংখ্যার দূরে ফেলে দিতে হবে - 10 , 100 , 1000 মান সহ ফলাফল দেখুন) )। ব্রেভিটিও দুর্দান্ত।
এটি ম্যাথ.আরন্ডম () (2 বা 3 এর একটি ফ্যাক্টর) থেকে কিছুটা ধীরে ধীরে, তবে আমি বিশ্বাস করি এটি জাভাস্ক্রিপ্টে লিখিত অন্য যে কোনও সমাধানের চেয়ে তত দ্রুত।
আমি সরল জাভাস্ক্রিপ্টে বেশ কয়েকটি ভাল, সংক্ষিপ্ত এবং দ্রুত সিউডোরানডম নম্বর জেনারেটর (পিআরএনজি) ফাংশন প্রয়োগ করেছি । এগুলির সকলকে বীজযুক্ত করা যায় এবং ভাল মানের নম্বর দেওয়া যায়।
প্রথমত, আপনার 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 হ'ল 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;
}
}
মুলবেরি 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 দরকার হয় এবং কয়েক বিলিয়ন এলোমেলো সংখ্যার প্রয়োজন নেই ( জন্মদিনের সমস্যাটি দেখুন )।
মে 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 এর বিভিন্ন আকারের এবং ভাল জাল কাঠামোর লিনিয়ার কগ্রুভেন্সি জেনারেটরগুলির একটি সারণী।
seed = (seed * 185852 + 1) % 34359738337
।
Math.imul
হিসাবে এটি যখন 32 বিট ইন্টিজার উপর সি গুণ ব্যবহার করে এটি would ওভারফ্লো করতে পারবেন। আপনি যা পরামর্শ দিচ্ছেন তা হ'ল জেএসের পূর্ণসংখ্যা স্পেসের সম্পূর্ণ পরিসীমা ব্যবহার করে একটি এলসিজি, যা অন্বেষণ করার জন্য অবশ্যই একটি আকর্ষণীয় ক্ষেত্র। :)
না, তবে এখানে একটি সাধারণ সিউডোর্যান্ডম জেনারেটর, উইকিপিডিয়া থেকে অভিযোজিত মাল্টিপ্লি-উইথ ক্যারি একটি বাস্তবায়ন (এর পরে অপসারণ করা হয়েছে):
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: গুরুতর বাস্তবায়নের ত্রুটিগুলি স্থির করা হয়েছে
seed
ফাংশন, র্যান্ডম জেনারেটর রিসেট করবেন কারণ mz_z
পরিবর্তনশীল যখন পরিবর্তিত হয় random()
বলা হয়। অতএব সেট করুন mz_z = 987654321
(বা অন্য কোনও মান)seed
m_w
, না m_z
। 2) উভয়ই m_w
এবং m_z
পূর্ববর্তী মানগুলিতে ভিত্তিক পরিবর্তন করা হয়, সুতরাং এটি ফলাফলকে সংশোধন করে।
অ্যান্টি সিকেরির অ্যালগরিদমটি দুর্দান্ত এবং সংক্ষিপ্ত। আমি প্রথমে একটি পরিবর্তন করেছি যা আপনি জাভাস্ক্রিপ্টের ম্যাথ.র্যান্ডমকে প্রতিস্থাপন করেছেন যখন আপনি ম্যাথ.সিড (গুলি) বলবেন, তবে জেসন মন্তব্য করেছিলেন যে ফাংশনটি ফিরে আসা আরও ভাল হবে:
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());
এটি আপনাকে জাভাস্ক্রিপ্টে নেই এমন আরও একটি কার্যকারিতা দেয়: একাধিক স্বতন্ত্র এলোমেলো জেনারেটর। এটি একইসাথে গুরুত্বপূর্ণ যদি আপনি একই সময়ে একাধিক পুনরাবৃত্তযোগ্য সিমুলেশনগুলি চলতে চান।
Math.random
যা আপনাকে একাধিক স্বাধীন জেনারেটর রাখার অনুমতি দেয়, তাইনা?
Math.seed(42);
এটি ফাংশনটি পুনরায় সেট করে, তাই আপনি যদি তা var random = Math.seed(42); random(); random();
পান 0.70...
তবে 0.38...
। যদি আপনি এটি var random = Math.seed(42);
আবার কল করে পুনরায় সেট করেন , তবে পরের বার আপনি যখন ফোন করবেন তখন random()
আপনি 0.70...
আবার পাবেন এবং পরের বার আপনি 0.38...
আবার পাবেন।
random
নেটিভ জাভাস্ক্রিপ্ট ফাংশন ওভাররাইটের পরিবর্তে স্থানীয় একটি ভেরিয়েবল ব্যবহার করার জন্য দয়া করে সময় নিন । ওভাররাইটিংয়ের Math.random
কারণে জেআইএসটি সংকলক আপনার সমস্ত কোড আনপটিমাইজ করতে পারে।
দয়া করে দেখুন পিয়ের এল'ইউকায়ারের কাজ 1980 এর দশকের শেষের দিকে এবং 1990 এর দশকের গোড়ার দিকে ফিরে যাচ্ছে। অন্যরাও আছেন। নিজেরাই (সিউডো) এলোমেলো সংখ্যা জেনারেটর তৈরি করা, আপনি যদি বিশেষজ্ঞ না হন তবে বেশ বিপজ্জনক, কারণ ফলাফলগুলি পরিসংখ্যানগতভাবে এলোমেলোভাবে বা অল্প সময়ের মধ্যে না আসার উচ্চ সম্ভাবনা রয়েছে। পিয়েরি (এবং অন্যান্য) কিছু ভাল (সিউডো) এলোমেলো সংখ্যা জেনারেটর একসাথে রেখেছেন যা কার্যকর করা সহজ। আমি তার একটি এলএফএসআর জেনারেটর ব্যবহার করি।
https://www.iro.umontreal.ca/~lecuyer/myftp/papers/handstat.pdf
ফিল ট্রয়
পূর্ববর্তী কয়েকটি উত্তরগুলির সংমিশ্রণ, এটি বীজযোগ্য র্যান্ডম ফাংশন যা আপনি খুঁজছেন:
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();
Math.seed(0)()
রিটার্ন 0.2322845458984375
, এবং Math.seed(1)()
রিটার্ন 0.23228873685002327
। উভয় m_w
এবং m_z
বীজ অনুযায়ী পরিবর্তন করা সহায়ক বলে মনে হচ্ছে। var m_w = 987654321 + s; var m_z = 123456789 - s;
বিভিন্ন বীজের সাথে প্রথম মানের একটি সুন্দর বিতরণ উত্পাদন করে।
আপনার নিজের সিউডো এলোমেলো জেনারেটর লিখতে খুব সহজ।
ডেভ স্কোটিসের পরামর্শটি কার্যকর তবে অন্যের নির্দেশ অনুসারে এটি পুরোপুরি সমানভাবে বিতরণ করা হয়নি।
তবে এটি পাপের পূর্ণসংখ্যার যুক্তিগুলির কারণে নয়। এটি কেবলমাত্র পাপের পরিসীমা কারণে, যা একটি বৃত্তের এক-মাত্রিক প্রক্ষেপণ হিসাবে ঘটে। পরিবর্তে আপনি যদি বৃত্তের কোণটি গ্রহণ করেন তবে এটি অভিন্ন হবে।
সুতরাং পাপের পরিবর্তে (এক্স) আরগ (এক্সপ্রেস (আই * এক্স)) / (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))
দয়া করে মনে রাখবেন যে রিয়েল এন্ট্রপি প্রয়োজন হলে আপনি ছদ্ম র্যান্ডম সিকোয়েন্সগুলি ব্যবহার করতে পারবেন না।
আজকাল জাভাস্ক্রিপ্টে অনেকগুলি বীজযোগ্য এলোমেলো সংখ্যা জেনারেটর প্রয়োজন ডেভিড বাউ এর বীজতলা মডিউল ব্যবহার করছেন ।
Math.random
না, তবে রান লাইব্রেরি এটি সমাধান করে। এটিতে আপনি কল্পনা করতে পারেন এমন প্রায় সমস্ত বিতরণ রয়েছে এবং বীজযুক্ত এলোমেলো সংখ্যা জেনারেশনকে সমর্থন করে। উদাহরণ:
ran.core.seed(0)
myDist = new ran.Dist.Uniform(0, 1)
samples = myDist.sample(1000)
আমি একটি ফাংশন লিখেছি যা একটি বীজযুক্ত এলোমেলো নম্বর দেয়, এটি ম্যাথ.সিনকে একটি দীর্ঘ এলোমেলো সংখ্যার জন্য ব্যবহার করে এবং সে থেকে সংখ্যা বাছতে বীজ ব্যবহার করে।
ব্যবহার:
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)
}
একটি নির্দিষ্ট বীজের জন্য একটি সহজ পদ্ধতির:
function fixedrandom(p){
const seed = 43758.5453123;
return (Math.abs(Math.sin(p)) * seed)%1;
}
0 এবং 100 এর মধ্যে একটি সংখ্যার জন্য।
Number.parseInt(Math.floor(Math.random() * 100))
Math.random
যে যখনই Math.random
একই বীজের সাথে বীজ বপন করা হয়, এটি একই ধারাবাহিক ধারাবাহিক এলোমেলো সংখ্যার উত্পাদন করে। প্রকৃত ব্যবহার / প্রদর্শনের বিষয়ে এই প্রশ্নটি বলা যায় না Math.random
।