HeadlinesBriefing HeadlinesBriefing 12 languages

When random is not actually random enough

Hacker News ·

🇬🇧 English

A common programming pattern picks random items using modulo: `choices[random_u64() % n]`. This seems intuitive but introduces statistical bias because the random range rarely divides evenly by the number of choices.

For example, picking from 3 items using a random number in [0, 9] gives 4 inputs to choice 1 (0, 3, 6, 9) but only 3 inputs each to choices 2 and 3. Choice 1 appears 40% of the time instead of the expected 33.3%. This modulo bias occurs whenever the random range isn't a multiple of the choice count.

The correct approach uses `random_between(l, h)` which properly distributes probability, though it's more complex to implement. Better API design would provide higher-level functions like `random_choice()` that accept explicit probability distributions, forcing developers to confront distribution requirements directly rather than relying on flawed low-level primitives.

View original article →


🇸🇦 العربية

لماذا يخلق الاختيار العشوائي باستخدام المودولو تحيزًا

نمط برمجي شائع يختار عناصر عشوائية باستخدام المودولو: `choices[random_u64() % n]`. يبدو هذا بديهيًا لكنه يُدخل تحيزًا إحصائيًا لأن النطاق العشوائي نادرًا ما يُقسم بالتساوي على عدد الخيارات.

على سبيل المثال، عند الاختيار من بين 3 عناصر باستخدام رقم عشوائي في النطاق [0, 9]، يحصل الخيار 1 على 4 مدخلات (0، 3، 6، 9) بينما يحصل كل من الخيارين 2 و 3 على 3 مدخلات فقط. يظهر الخيار 1 بنسبة 40% من الوقت بدلًا من النسبة المتوقعة 33.3%. يحدث هذا التحيز باستخدام المودولو كلما لم يكن النطاق العشوائي مضاعفًا لعدد الخيارات.

النهج الصحيح يستخدم `random_between(l, h)` الذي يوزع الاحتمال بشكل صحيح، على الرغم من أن تنفيذه أكثر تعقيدًا. سيوفر تصميم API أفضل وظائف على مستوى أعلى مثل `random_choice()` التي تقبل توزيعات احتمال صريحة، مما يجبر المطورين على مواجهة متطلبات التوزيع مباشرة بدلاً من الاعتماد على primitives منخفضة المستوى معيبة.

لماذا يخلق الاختيار العشوائي باستخدام المودولو تحيزًا؟

عندما لا يكون نطاق الرقم العشوائي قابلًا للقسمة بالتساوي على عدد الخيارات، يحصل بعض الخيارات على مدخلات محتملة أكثر من الآخرين. على سبيل المثال، عند اختيار 3 عناصر من 10 قيم عشوائية، يحصل العنصر الأول على 4 مدخلات بينما يحصل كل من العنصرين الآخرين على 3 مدخلات فقط، مما يخلق احتمال اختيار 40% مقابل 30% بدلًا من الاحتمال المتساوي 33.3%.

العربية version →


🇧🇩 বাংলা

কেন মডুলো র্যান্ডম সিলেকশন পক্ষপাত তৈরি করে

একটি সাধারণ প্রোগ্রামিং প্যাটার্ন মডুলো ব্যবহার করে র্যান্ডম আইটেম বেছে নেয়: `choices[random_u64() % n]`. এটি সহজে বোঝা যায় কিন্তু সांখ্যিকীয় পক্ষপাত তৈরি করে কারণ র্যান্ডম রেঞ্জ প্রায়শই পছন্দের সংখ্যা দ্বারা সমানভাবে ভাগ করা যায় না।

উদাহরণস্বরূপ, [0, 9] পরিসরের র্যান্ডম নম্বর ব্যবহার করে 3 আইটেম থেকে বেছে নিলে, চয়স 1 কে 4 ইনপুট मिलে (0, 3, 6, 9) কিন্তু চয়স 2 এবং 3 কে প্রতিটikos 3 ইনপুট मिलता है। চয়স 1 40% সময়ে বেছে নেওয়া হয়, প্রত্যাশিত 33.3% এর পরিবর্তে। এই মডুলো পক্ষপাত তখন ঘটে যখন র্যান্ডম রেঞ্জ পছন্দের সংখ্যার গুণফল নয়।

সঠিক পদ্ধতি `random_between(l, h)` ব্যবহার করে, যা সঠিকভাবে সম্ভাব্য বিতরণ করে, যদিও এটি বাস্তবায়ন করা জটিল। ভালো API ডিজাইন `random_choice()` এর মতো উচ্চ-স্তরের ফাংশন প্রদান করবে যা স্পষ্ট সম্ভাব্য বিতরণ গ্রহণ করবে, ডেভেলপারদের বাধ্য করবে যে তারা ত্রুটিপূর্ণ নিম্ন-স্তরের প্রিমিটিভে নির্ভর করার পরিবর্তে বিতরণের প্রয়োজনীয়তা মোকাবেলা করবেন।

মডুলো র্যান্ডম সিলেকশন কেন পক্ষপাত তৈরি করে?

যদি র্যান্ডম নম্বরের পরিসর পছন্দের সংখ্যা দ্বারা সমানভাবে বিভাজ্য না হয়, তাহলে কিছু পছন্দ অন্য পছন্দের তুলনায় יותר সম্ভাব্য ইনপুট পায়। উদাহরণস্বরূপ, 10 র্যান্ডম মান থেকে 3 আইটেম বেছে নিলে, প্রথম আইটেমকে 4 ইনপুট मिलता है কিন্তু প্রতিটি অন্যান্য আইটেমকে শুধু 3 ইনপুট मिलता है, ফলে প্রথম আইটেমের বেছে নেওয়ার সম্ভাবনা 40% হয়, প্রতিটি অন্যান্য का 30% হয়, প্রত্যাশিত সমান 33.3% এর পরিবর্তে।

বাংলা version →


🇩🇪 Deutsch

Warum die zufällige Auswahl mit Modulo Verzerrung erzeugt

Ein häufiges Programmiermuster wählt zufällige Elemente mittels Modulo aus: `choices[random_u64() % n]`. Dies erscheint intuitiv, führt aber zu statistischer Verzerrung, weil der Zufallsbereich selten gleichmäßig durch die Anzahl der Optionen teilbar ist.

Zum Beispiel ergibt die Auswahl aus 3 Elementen mit einer Zufallszahl im Bereich [0, 9] für die Option 1 4 Eingaben (0, 3, 6, 9), während jede der Optionen 2 und 3 nur 3 Eingaben erhält. Damit wird die Option 1 in 40 % der Fälle ausgewählt statt der erwarteten 33,3 %. Dieser Modulo-Verzerrungseffekt tritt immer auf, wenn der Zufallsbereich kein Vielfaches der Optionenzahl ist.

Der richtige Ansatz verwendet `random_between(l, h)`, der die Wahrscheinlichkeit korrekt verteilt, obwohl seine Implementierung komplexer ist. Ein besseres API-Design würde Funktionen höherer Ebene wie `random_choice()` bereitstellen, die explizite Wahrscheinlichkeitsverteilungen akzeptieren und Entwickler zwingen, sich direkt mit den Verteilungsanforderungen auseinanderzusetzen, anstatt auf fehlerhafte Niedrigstufen-Primitiven zu verlassen.

Warum erzeugt die zufällige Auswahl mit Modulo Verzerrung?

Wenn der Bereich der Zufallszahlen nicht gleichmäßig durch die Anzahl der Optionen teilbar ist, erhalten einige Optionen mehr mögliche Eingaben als andere. Beispielsweise ergibt die Auswahl von 3 Elementen aus 10 Zufallswerten für das erste Element 4 Eingaben, während jedes der anderen beiden Elemente nur 3 Eingaben erhält. Dies führt zu einer Auswahlwahrscheinlichkeit von 40 % für das erste Element gegenüber 30 % für jedes der anderen, anstatt der erwarteten gleichmäßigen Wahrscheinlichkeit von 33,3 %.

Deutsch version →


🇪🇸 Español

Por qué la selección aleatoria con módulo crea sesgo

Un patrón común de programación selecciona elementos aleatorios usando módulo: `choices[random_u64() % n]`. Esto parece intuitivo pero introduce sesgo estadístico porque el rango aleatorio rara vez se divide uniformemente por el número de opciones.

Por ejemplo, al elegir entre 3 elementos usando un número aleatorio en [0, 9], se le dan 4 entradas a la opción 1 (0, 3, 6, 9) pero solo 3 entradas cada una a las opciones 2 y 3. La opción 1 aparece el 40% de las veces en lugar del esperado 33.3%. Este sesgo de módulo ocurre siempre que el rango aleatorio no sea múltiplo del número de opciones.

El enfoque correcto utiliza `random_between(l, h)`, que distribuye correctamente la probabilidad, aunque es más complejo de implementar. Un mejor diseño de API proporcionaría funciones de nivel superior como `random_choice()` que acepten distribuciones de probabilidad explícitas, obligando a los desarrolladores a enfrentar directamente los requisitos de distribución en lugar de depender de primitivas de bajo nivel defectuosas.

¿Por qué la selección aleatoria con módulo crea sesgo?

Cuando el rango de números aleatorios no es divisible uniformemente por el número de opciones, algunas opciones reciben más entradas posibles que otras. Por ejemplo, al elegir 3 elementos de 10 valores aleatorios, se le dan 4 entradas al primer elemento pero solo 3 a cada uno de los otros, creando una probabilidad de selección del 40% frente al 30% en lugar de un 33.3% equitativo.

Español version →


🇫🇷 Français

Pourquoi la sélection aléatoire par modulo crée un biais

Un modèle de programmation courant choisit des éléments aléatoires en utilisant le modulo : `choices[random_u64() % n]`. Cela semble intuitif mais introduit un biais statistique parce que la plage aléatoire rarement se divise uniformément par le nombre de choix.

Par exemple, choisir parmi 3 éléments en utilisant un nombre aléatoire dans [0, 9] donne 4 entrées au choix 1 (0, 3, 6, 9) mais seulement 3 entrées chacune aux choix 2 et 3. Le choix 1 apparaît 40 % du temps au lieu des 33,3 % attendus. Ce biais de modulo se produit chaque fois que la plage aléatoire n'est pas un multiple du nombre de choix.

La bonne approche utilise `random_between(l, h)` qui distribue correctement la probabilité, bien qu'elle soit plus complexe à implémenter. Une meilleure conception d'API fournirait des fonctions de niveau supérieur comme `random_choice()` qui acceptent des distributions de probabilité explicites, obligeant les développeurs à affronter directement les exigences de distribution plutôt que de s'appuyer sur des primitives de bas niveau défectueuses.

Pourquoi la sélection aléatoire par modulo crée-t-elle un biais ?

Lorsque la plage de nombres aléatoires n'est pas divisible uniformément par le nombre de choix, certains choix obtiennent plus d'entrées possibles que d'autres. Par exemple, choisir 3 éléments parmi 10 valeurs aléatoires donne 4 entrées au premier élément mais seulement 3 à chacun des autres, créant une probabilité de sélection de 40 % contre 30 % au lieu de l'égalité attendue de 33,3 %.

Français version →


🇮🇳 हिन्दी

क्यों मॉड्यूलो यादृच्छिक चयन पक्षपात पैदा करता है

एक सामान्य प्रोग्रामिंग पैटर्न मॉड्यूलो का उपयोग करके यादृच्छिक आइटम चुनता है: `choices[random_u64() % n]`. यह सहज लगता है लेकिन सांख्यिकीय पक्षपात लाता है क्योंकि यादृच्छिक सीमा अक्सर विकल्पों की संख्या से समान रूप से विभाजित नहीं होती।

उदाहरण के लिए, 0 से 9 तक के यादृच्छिक संख्या के उपयोग से 3 आइटम चुनने पर, विकल्प 1 को 4 इनपुट मिलते हैं (0, 3, 6, 9) लेकिन विकल्प 2 और 3 को प्रत्येक को केवल 3 इनपुट मिलते हैं। विकल्प 1 40% समय पर दिखाई देता है जबकि अपेक्षित 33.3% के बजाय। यह मॉड्यूलो पक्षपात तब होता है जब यादृच्छिक सीमा विकल्पों की संख्या का गुणज नहीं होती।

सही दृष्टिकोण `random_between(l, h)` का उपयोग करता है, जो संभावना को सही ढंग से वितरित करता है, हालांकि इसे लागू करना अधिक जटिल है। बेहतर API डिज़ाइन में `random_choice()` जैसे उच्च-स्तर के फ़ंक्शन प्रदान किए जाएंगे जो स्पष्ट संभावना वितरण स्वीकार करते हैं, जिससे डेवलपर्स को वितरण आवश्यकताओं का सीधे सामना करना पड़ता है और वे दोषपूर्ण निम्न-स्तर के प्राइमिटिव्स पर निर्भर नहीं रहते।

मॉड्यूलो यादृच्छिक चयन क्यों पक्षपात पैदा करता है?

जब यादृच्छिक संख्या की सीमा विकल्पों की संख्या से समान रूप से विभाजित नहीं होती, तो कुछ विकल्पों को अन्य की तुलना में अधिक संभावित इनपुट मिलते हैं। उदाहरण के लिए, 10 यादृच्छिक मानों से 3 आइटम चुनने पर, पहले आइटम को 4 इनपुट मिलते हैं लेकिन प्रत्येक अन्य को केवल 3 मिलते हैं, जिससे पहले आइटम का चयन 확률 40% होता है जबकि प्रत्येक अन्य का 30% होता है, अपेक्षित समान 33.3% के बजाय।

हिन्दी version →


🇮🇩 Bahasa Indonesia

Mengapa Pemilihan Acak dengan Modulo Menimbulkan Bias

Pola pemrograman umum memilih item acak menggunakan modulo: `choices[random_u64() % n]`. Ini terasa intuitif tetapi menimbulkan bias statistik karena rentang acak jarang habis dibagi oleh jumlah pilihan.

Misalnya, memilih dari 3 item menggunakan angka acak dalam rentang [0, 9] memberikan 4 input ke pilihan 1 (0, 3, 6, 9) tetapi hanya 3 input masing-masing ke pilihan 2 dan 3. Pilihan 1 muncul 40% waktu alih-alih yang diharapkan 33,3%. Bias modulo terjadi setiap kali rentang acak bukan kelipatan dari jumlah pilihan.

Pendekatan yang benar menggunakan `random_between(l, h)` yang mendistribusikan probabilitas dengan benar, sebbene lebih kompleks untuk diimplementasikan. Desain API yang lebih baik akan menyediakan fungsi tingkat tinggi seperti `random_choice()` yang menerima distribusi probabilitas eksplisit, memaksa pengembang untuk langsung menghadapi persyaratan distribusi alih-alih bergantung pada primitif tingkat rendah yang cacat.

Mengapa pemilihan acak dengan modulo menimbulkan bias?

Saat rentang angka acak tidak habis dibagi oleh jumlah pilihan, beberapa pilihan mendapatkan lebih banyak input yang mungkin daripada yang lain. Sebagai contoh, memilih 3 item dari 10 nilai acak memberikan 4 input ke item pertama tetapi hanya 3 input ke masing-masing item lainnya, sehingga probabilitas pemilihan item pertama menjadi 40% sementara masing-masing item lain 30%, alih-alih probabilitas sama yang diharapkan 33,3%.

Bahasa Indonesia version →


🇯🇵 日本語

なぜモジュロによるランダム選択がバイアスを生むのか

一般的なプログラミングパターンは、モジュロを使ってランダムなアイテムを選択します:`choices[random_u64() % n]`。これは直感的に思えますが、ランダム範囲が選択肢の数で均等に割り切れないため統計的バイアスを生じます。

たとえば、[0, 9] の範囲のランダム数を使って 3 つのアイテムから選ぶと、選択肢 1 には 4 つの入力 (0, 3, 6, 9) が割り当てられますが、選択肢 2 と 3 にはそれぞれ 3 つしか入力が割り当てられません。その結果、選択肢 1 は期待される 33.3% ではなく 40% の確率で選ばれます。このモジュロバイアスは、ランダム範囲が選択肢の数の倍数でないときに発生します。

正しいアプローチは `random_between(l, h)` を使うことで、これは確率を適切に分配しますが、実装はより複雑です。より良いAPI設計では、`random_choice()` のような高レベルの関数を提供し、明示的な確率分布を受け入れるようにするべきです。これにより、開発者は欠陥のある低レベルプリミティブに頼るのではなく、分布の要件に直接向き合うようになります。

なぜモジュロによるランダム選択がバイアスを生むのか?

ランダム数の範囲が選択肢の数で均等に割り切れないとき、一部の選択肢は他の選択肢よりも多くの可能な入力を得ます。たとえば、10 個のランダム値から 3 つのアイテムを選ぶとき、最初のアイテムには 4 つの入力が割り当てられますが、他のそれぞれのアイテムには 3 つしか割り当てられません。これにより、最初のアイテムの選択確率は 40% になり、他のそれぞれのアイテムは 30% になります。期待される均等な確率 33.3% ではなく。

日本語 version →


🇧🇷 Português

Por que a seleção aleatória com módulo cria viés

Um padrão comum de programação seleciona itens aleatórios usando módulo: `choices[random_u64() % n]`. Isso parece intuitivo, mas introduz viés estatístico porque o intervalo aleatório raramente se divide uniformemente pelo número de opções.

Por exemplo, ao escolher entre 3 itens usando um número aleatório no intervalo [0, 9], a escolha 1 recebe 4 entradas (0, 3, 6, 9), enquanto as escolhas 2 e 3 recebem apenas 3 entradas cada. A escolha 1 aparece 40% do tempo, em vez dos esperados 33,3%. Esse viés de módulo ocorre sempre que o intervalo aleatório não for múltiplo do número de opções.

A abordagem correta usa `random_between(l, h)`, que distribui a probabilidade corretamente, embora seja mais complexo de implementar. Um melhor design de API forneceria funções de nível superior como `random_choice()` que aceitam distribuições de probabilidade explícitas, obrigando os desenvolvedores a enfrentar diretamente os requisitos de distribuição, em vez de depender de primitivas de baixo nível defeituosas.

Por que a seleção aleatória com módulo cria viés?

Quando o intervalo de números aleatórios não é divisível uniformemente pelo número de opções, algumas opções recebem mais entradas possíveis do que outras. Por exemplo, ao escolher 3 itens de 10 valores aleatórios, o primeiro item recebe 4 entradas, enquanto cada um dos outros recebe apenas 3, criando uma probabilidade de seleção de 40% versus 30% em vez da probabilidade igual esperada de 33,3%.

Português version →


🇷🇺 Русский

Почему выбор случайного элемента по модулю создает смещение

Распространенный шаблон программирования выбирает случайные элементы с использованием модуля: `choices[random_u64() % n]`. Это кажется интуитивно понятным, но вводит статистическое смещение, потому что диапазон случайных чисел редко делится равномерно на количество вариантов.

Например, при выборе из 3 элементов с использованием случайного числа в диапазоне [0, 9] первому варианту достается 4 входных значения (0, 3, 6, 9), тогда как каждому из вариантов 2 и 3 — только по 3. Первый вариант выбирается в 40% случаев вместо ожидаемых 33,3%. Это смещение по модулю возникает всякий раз, когда диапазон случайных чисел не является кратным количеству вариантов.

Правильный подход использует функцию `random_between(l, h)`, которая корректно распределяет вероятность, хотя её реализация сложнее. Лучший дизайн API предоставил бы функции более высокого уровня, например `random_choice()`, принимающие явные распределения вероятностей, заставляя разработчиков непосредственно сталкиваться с требованиями к распределению, а не полагаться на ошибочные низкоуровневые примитивы.

Почему выбор случайного элемента по модулю создает смещение?

Когда диапазон случайных чисел не делится равномерно на количество вариантов, некоторые варианты получают больше возможных входных значений, чем другие. Например, при выборе 3 элементов из 10 случайных значений первому элементу достается 4 входных значения, тогда как каждому из остальных двух — только по 3, что приводит к вероятности выбора первого элемента 40% вместо ожидаемых 33,3%, а остальных — по 30%.

Русский version →


🇨🇳 简体中文

为什么模数随机选择会产生偏差

A common programming pattern picks random items using modulo: `choices[random_u64() % n]`. This seems intuitive but introduces statistical bias because the random range rarely divides evenly by the number of choices.

For example, picking from 3 items using a random number in [0, 9] gives 4 inputs to choice 1 (0, 3, 6, 9) but only 3 inputs each to choices 2 and 3. Choice 1 appears 40% of the time instead of the expected 33.3%. This modulo bias occurs whenever the random range isn't a multiple of the choice count.

The correct approach uses `random_between(l, h)` which properly distributes probability, though it's more complex to implement. Better API design would provide higher-level functions like `random_choice()` that accept explicit probability distributions, forcing developers to confront distribution requirements directly rather than relying on flawed low-level primitives.

为什么模数随机选择会产生偏差?

当随机数范围不能被选项数量整除时,某些选项会获得比其他选项更多的可能输入。例如,从 10 个随机值中选择 3 个项目时,第一个项目会得到 4 个输入(0、3、6、9),而其他每个项目只有 3 个输入,导致第一个项目被选中的概率为 40%,而其他每个项目为 30%,而不是预期的均等 33.3%。

简体中文 version →