هل تحتاج إلى طريقة سريعة وعادلة للحصول على رقم عشوائي؟ يولّد مولد الأرقام العشوائية المجاني هذا رقمًا واحدًا — أو قائمة كاملة من الأرقام — ضمن أي نطاق تختاره، من نطاق بسيط من 1 إلى 10 وصولًا إلى نطاقات تمتد إلى المليارات. حدد القيمتين الدنيا والقصوى في حقلي «الحد الأدنى» و«الحد الأقصى»، واختر عدد الأرقام التي تحتاجها في حقل «العدد»، ثم اضغط على «توليد». يشمل النطاق الحدين معًا، بحيث يمكن لنطاق من 1 إلى 10 أن يُرجع كلًا من 1 و10.
يُولَّد كل رقم مباشرةً في متصفحك عبر واجهة Web Crypto API (crypto.getRandomValues) — التي توفر قيمًا عشوائية قوية تشفيريًا من العشوائية الأساسية لنظام التشغيل الخاص بك. لا يُرسَل أي شيء إلى خادم، ولا يُسجَّل أي شيء، ولا نرى أرقامك أبدًا. التوليد فوري وخاص، ويستمر في العمل حتى على اتصال بطيء بعد تحميل الصفحة.
صُمِّمت الخيارات للمواقف الحقيقية التي يحتاج فيها الناس فعلًا إلى أرقام عشوائية. فعّل «بدون تكرار» حتى لا يظهر أي رقم مرتين — وهو الإعداد الذي تحتاجه للقرعات، أو السحوبات على طريقة اليانصيب، أو تقسيم الأشخاص إلى مجموعات دون تكرار. هل تحتاج إلى عشرين فائزًا من بين 500 مشارك؟ اضبط «الحد الأدنى» على 1 و«الحد الأقصى» على 500، وفعّل «بدون تكرار»، واضبط «العدد» على 20، ثم اضغط على «توليد». يرتب «ترتيب الفرز» النتيجة تصاعديًا أو تنازليًا، ويقوم زر واحد بنسخ جميع النتائج دفعة واحدة. عند تبديل «تنسيق الإخراج» من «سطر جديد» إلى «مفصول بمسافات» أو «مفصول بفواصل» يظهر حقل «عدد المجموعات»: عدة سحوبات مستقلة في آن واحد — مثل عشرين مجموعة من 3 أرقام لعشرين جولة قرعة — بينما يحدد «السماح بالتكرار بين المجموعات» ما إذا كان يمكن ظهور الرقم نفسه في أكثر من واحدة منها.
كيف تُولَّد العشوائية فعليًا؟ يوفر متصفحك قيمًا عشوائية قوية تشفيريًا عبر واجهة Web Crypto API، لا عبر دالة PRNG في JavaScript مثل Math.random(). عند الضغط على «توليد»، تطلب الصفحة قيمًا عشوائية عبر crypto.getRandomValues وتستخدمها لتوليد أرقام ضمن النطاق الذي اخترته. يأتي مصدر العشوائية الأساسي من نظام التشغيل، لذا لا تحتاج الصفحة إلى الاحتفاظ ببذرة (seed) خاصة بها أو تسلسل شبه عشوائي.
تحويل قيمة خام إلى نطاقك هو المكان الذي تُخطئ فيه المولدات بصمت، ويستحق فقرة مستقلة. أخذ باقي قسمة القيمة على حجم النطاق هو الأسلوب البديهي والمتحيز في آن واحد: فما لم يكن 2^32 قابلاً للقسمة تمامًا على حجم النطاق، تظهر الأرقام الأصغر بشكل أكثر تكرارًا قليلًا من البقية. يُسمى هذا الخلل modulo bias، وهو قابل للقياس وليس نظريًا فقط. يقوم هذا المولد بدلًا من ذلك بتجاهل أي قيمة تتجاوز أكبر مضاعف دقيق للنطاق، ويولّد من جديد — وهي تقنية تُسمى rejection sampling. يكلّف هذا بضع محاولات إضافية، لكنه يمنح في المقابل ضمانًا دقيقًا: يحمل كل رقم بين «الحد الأدنى» و«الحد الأقصى» الاحتمال نفسه تمامًا، لا احتمالًا شبه متساوٍ.
ما الذي يجعل الرقم عشوائيًا حقًا؟ يكون الرقم عشوائيًا بما يكفي عندما لا تكشف النتائج السابقة عن شيء بخصوص التالي — وفي الواقع توجد ثلاثة مستويات لذلك. تنفّذ دالة شبه عشوائية عادية مثل Math.random() خوارزمية حتمية: يستطيع أي شخص يتعرف على حالتها الداخلية إعادة إنتاج التسلسل بأكمله، ما يجعلها مناسبة لخلط شرائح عرض تقديمي، وغير مناسبة لأي شيء لا يجب أن تكون نتيجته متوقعة. المولد الآمن تشفيريًا (CSPRNG) — وهو المستوى الذي تستخدمه هذه الأداة — هو أيضًا خوارزمية، لكنه مصمم لإنتاج قيم غير متوقعة باستخدام مصدر آمن لعشوائية النظام، ومبني بحيث لا تكشف مراقبة مخرجاته عن شيء بخصوص ما سيأتي بعدها. أما العشوائية الفيزيائية، من مصادر مثل الضجيج الجوي أو الاضمحلال الإشعاعي، فتقف فوق كلا المستويين، رغم أن الفرق العملي يزول عندما يتعلق الأمر بتوليد رقم من نطاق. لهذا السبب بالتحديد تُتيح المتصفحات واجهة تشفير منفصلة بدلًا من الاكتفاء بتحسين Math.random(): فكلاهما يحل مشكلة مختلفة، وواحد منهما فقط آمن عندما تكون النتيجة مهمة لشخص ما.
لا يُفترض أن يبدو التسلسل العشوائي عشوائيًا للبشر. ولّد عشرة أرقام بين 1 و10، وستلاحظ بانتظام تكرارًا، أو زوجًا شبه متطابق مثل 7، 7، 8، أو سلسلة قصيرة ترتفع بأكملها — وكل حالة من هذه الحالات طبيعية تمامًا. العشوائية الحقيقية غير متوقعة، لا متساوية التوزيع: يظهر كل رقم بشكل مستقل عن سابقيه، ولا تملك الأرقام السابقة أي تأثير على اللاحقة إطلاقًا، ولا يحين «دور» أي رقم للظهور أكثر من غيره أبدًا. الغريزة التي تزعم عكس ذلك هي مغالطة المقامر، وهي الغريزة نفسها التي تجعل البشر أنفسهم مولدات ضعيفة للأرقام العشوائية — فعندما يُطلب منا ابتكار تسلسل عشوائي، نتجنب التكرار ونوزّع القيم بتساوٍ أكبر بكثير مما قد تفعله الصدفة أبدًا. النتيجة التي تبدو منظمة بشكل مثير للريبة هي بصمة إنسان؛ أما العشوائية الحقيقية فتنتج تكتلات.
لماذا تختار مولد الأرقام العشوائية هذا؟
- التوليد داخل المتصفح فقط: تُولَّد الأرقام على جهازك ولا تُرسَل إلى أي مكان أبدًا
- عشوائية عبر واجهة Web Crypto API: آمنة تشفيريًا، وليست Math.random()
- بلا modulo bias: يحافظ rejection sampling على احتمال متساوٍ لكل رقم في النطاق
- أي نطاق: من 1 إلى 10 وصولًا إلى قيم تمتد إلى المليارات، مع شمول الحدين
- وضع «بدون تكرار»: ولّد قائمة دون تكرار للقرعات وتقسيم المجموعات
- مجموعات متعددة: عدة سحوبات مستقلة بنقرة واحدة
- الفرز وتنسيقات الإخراج: تصاعدي أو تنازلي، سطر جديد، مسافات أو فواصل
- السجل والحفظ في ملف: احتفظ بسجل لسحب قد تحتاج إلى تبريره
- غير محدود ومجاني: بلا تسجيل، بلا حدود استخدام، لا شيء على خوادمنا
تظهر الأرقام العشوائية في أماكن أكثر بكثير مما يتوقعه معظم الناس. يستدعي المعلمون الطلاب دون محاباة أحد. يسحب مقدمو البث المباشر وفرق التسويق أسماء الفائزين بالهدايا والقرعات أمام جمهور يجب أن يثق بالنتيجة. يستبدل اللاعبون نردًا مفقودًا أو يقررون من يبدأ أولًا، بينما تسحب البطولات ترتيب البداية. يختار الباحثون عيّنة عشوائية حتى تنطبق نتائجهم أيضًا على من لم يشاركوا. يولّد المطورون بيانات اختبار، ويضبطون بذرة (seed) للمحاكاة، ويختارون معرّفات أثناء ضمان الجودة (QA). القاسم المشترك هو عملية اختيار عشوائية يمكن تفسيرها لاحقًا: فبما أن السحب يستخدم عشوائية تشفيرية ويحدث بالكامل على جهازك، يمكنك إظهار كيفية توليد النتيجة إذا شكك فيها أحد.
يحمل هذا المولد بعض القيود المعقولة التي يجدر بك معرفتها. لا يمكن لوضع «بدون تكرار» توليد أرقام أكثر مما يحتويه النطاق: فعشرون قيمة فريدة بين 1 و10 غير موجودة أصلًا. السحوبات مستقلة ولا تؤثر النتائج السابقة على اللاحقة، لذا لا يعيد تحديث الصفحة ضبط أي دورة — فببساطة لا توجد دورة لتكون فيها. ورغم أن الأرقام قوية تشفيريًا، فإن السحب هنا اختيار عادل لا تنبؤ: تستخدم سحوبات اليانصيب الرسمية معداتها الخاصة، الفعلية أو المعتمدة، وليس لما يُحسب في متصفحك أي صلة بها. وضمن هذه القيود يبقى الضمان قويًا: يحصل كل رقم في نطاقك على الفرصة نفسها تمامًا، في كل سحب على حدة.