چگونه با استفاده از جاوااسکریپت یک عدد تصادفی با طول ثابت تولید کنیم؟
من سعی دارم یک عدد تصادفی تولید کنم که طول آن دقیقاً ۶ رقم باشد.
نمیدانم آیا کد زیر در جاوااسکریپت ممکن است عددی کمتر از ۶ رقم ایجاد کند؟
Math.floor((Math.random()*1000000)+1);
من این سؤال و پاسخ را در StackOverflow اینجا پیدا کردم. اما، واضح نیست.
ویرایش: من کد بالا را چندین بار اجرا کردم و بله، اغلب اوقات اعدادی کمتر از ۶ رقم ایجاد میکند. آیا راه سریع و آسانی وجود دارد تا مطمئن شویم که همیشه دقیقاً ۶ رقم باشد؟
پاسخ شماره ۱
console.log(Math.floor(100000 + Math.random() * 900000));همیشه یک عدد ۶ رقمی ایجاد خواهد کرد و تضمین میکند که رقم اول هرگز ۰ نخواهد بود. کدی که در سوال شما آمده است عدد کمتر از ۶ رقمی ایجاد میکند.
پاسخ شماره ۲
تنها پاسخ کاملاً قابل اعتماد که تصادفی بودن کامل ارائه میدهد، بدون هیچگونه از دست رفتن. سایر پاسخها قبل از این پاسخ، بسته به تعداد کاراکتری که میخواهید، همه مقداری از دست میدهند. هر چه بیشتر بخواهید، تصادفی بودن بیشتری از دست میدهند.
آنها به آن دست مییابند با محدود کردن تعداد اعداد ممکن که قبل از طول ثابت قرار میگیرند.
بنابراین، برای مثال، یک عدد تصادفی با طول ثابت ۲، بین ۱۰ تا ۹۹ خواهد بود. برای طول ۳، بین ۱۰۰ تا ۹۹۹. برای طول ۴، بین ۱۰۰۰ تا ۹۹۹۹. برای طول ۵، بین ۱۰۰۰۰ تا ۹۹۹۹۹ و به همین ترتیب. همانطور که از الگو دیده میشود، این نشان میدهد که ۱۰٪ از تصادفی بودن از دست رفته است زیرا اعداد قبل از آن ممکن نیستند. چرا؟
برای اعداد واقعاً بزرگ (۱۸، ۲۴، ۴۸) ۱۰٪ هنوز هم تعداد زیادی عدد است که از دست میرود.
function generate(n, chunks = 0, separator = ' ') {
var add = 1, max = 12 - add; // 12 is the min safe number Math.random() can generate without it starting to pad the end with zeros.
var out;
if ( n > max ) {
out = generate(max) + generate(n - max);
}
else {
max = Math.pow(10, n+add);
var min = max/10; // Math.pow(10, n) basically
var number = Math.floor( Math.random() * (max - min + 1) ) + min;
out = ("" + number).substring(add);
}
if (chunks > 0 && n > chunks) {
// Insert separator every chunks characters
const instead = []; for (let i = 0; i < out.length; i++) {
if (i > 0 && i % chunks === 0) instead.push(separator);
instead.push(out[i]);
}
return instead.join('');
}
return out;
}
ژنراتور امکان طول تقریباً بینهایت را بدون از دست دادن دقت و با حداقل هزینه عملکرد فراهم میکند.
مثال :
generate(2)
"03"
generate(2)
"72"
generate(2)
"20"
generate(3)
"301"
generate(3)
"436"
generate(3)
"015"
generate(9, 3)
"134 456 890"
generate(9, 3, '|')
"134|456|890"
همانطور که میبینید، حتی صفرها هم در ابتدا شمرده شدهاند که این یک 10٪ خسارت اضافی است، فقط همین، به جز این واقعیت که اعداد کمتر از 10^n ممکن نیستند.
این اکنون به مجموع ۲۰٪ رسیده است.
همچنین، سایر گزینهها یک حد بالایی برای تعداد کاراکترهایی که واقعاً میتوانید تولید کنید دارند.
مثال با هزینه:
var start = new Date(); var num = generate(1000); console.log('Time: ', new Date() - start, 'ms for', num)
گزارشها :
Time: 0 ms for 7884381040581542028523049580942716270617684062141718855897876833390671831652069714762698108211737288889182869856548142946579393971303478191296939612816492205372814129483213770914444439430297923875275475120712223308258993696422444618241506074080831777597175223850085606310877065533844577763231043780302367695330451000357920496047212646138908106805663879875404784849990477942580056343258756712280958474020627842245866908290819748829427029211991533809630060693336825924167793796369987750553539230834216505824880709596544701685608502486365633618424746636614437646240783649056696052311741095247677377387232206206230001648953246132624571185908487227730250573902216708727944082363775298758556612347564746106354407311558683595834088577220946790036272364740219788470832285646664462382109714500242379237782088931632873392735450875490295512846026376692233811845787949465417190308589695423418373731970944293954443996348633968914665773009376928939207861596826457540403314327582156399232931348229798533882278769760
بیشتر سختگیرانه:
generate(100000).length === 100000 -> true
پاسخ شماره ۳
من با این راهحل میروم:
Math.floor(Math.random() * 899999 + 100000)
پاسخ شماره ۴
به طور کلیتر، تولید یک عدد صحیح تصادفی با طول ثابت میتواند با استفاده از Math.pow انجام شود:
var randomFixedInteger = function (length) {
return Math.floor(Math.pow(10, length-1) + Math.random() * (Math.pow(10, length) - Math.pow(10, length-1) - 1));
}
برای پاسخ به سؤال: randomFixedInteger(6);
پاسخ شماره ۵
شما میتوانید از کد زیر برای تولید یک عدد تصادفی که همیشه ۶ رقمی خواهد بود استفاده کنید:
Math.random().toString().substr(2, 6)
امیدوارم این برای همه مفید باشد :)
به طور خلاصه، این کار به این صورت است که Math.random() یک عدد تصادفی بین 0 و 1 تولید میکند که ما آن را به رشته تبدیل میکنیم با استفاده از .toString() و نمونهای 6 رقمی از آن رشته با استفاده از .substr() میگیریم با پارامترهای 2, 6 تا نمونه را از دومین کاراکتر شروع کرده و برای 6 کاراکتر ادامه دهیم.
این میتواند برای هر طول عدد استفاده شود.
اگر میخواهید بیشتر در این باره مطالعه کنید، در اینجا چند لینک به مستندات آورده شده است تا کمی از جستجوی گوگل شما صرفهجویی شود:
Math.random(): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random
.toString(): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString
.substr(): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr
