Maison > développement back-end > C++ > le corps du texte

Pourquoi `rand() % 14` ne renvoie-t-il que 6 ou 13 sur les systèmes Apple ?

Susan Sarandon
Libérer: 2024-11-24 20:59:21
original
806 Les gens l'ont consulté

Why Does `rand() % 14` Only Return 6 or 13 on Apple Systems?

Mystère de rand() % 14 ne donnant que 6 ou 13

Un programmeur a rencontré un problème particulier où rand() % 14 est systématiquement renvoie seulement 6 ou 13 dans leur programme C. Malgré l'exécution du programme plusieurs fois, ces valeurs sont les résultats exclusifs.

Le code en question :

#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

int main(int argc, const char * argv[])
{
    srand(time(NULL));
    cout << rand() % 14;
    return 0;
}
Copier après la connexion

Le coupable : le générateur de nombres aléatoires MCG d'Apple

Selon Wikipedia, le multiplicateur utilisé par le générateur de nombres aléatoires (RNG) Marsaglia-Crépeau d'Apple est 16807. Malheureusement, ce multiplicateur est divisible par 7. Par conséquent, le nombre aléatoire initial généré après srand() ne possède qu'un seul bit d'entropie modulo 14, le limitant à deux valeurs possibles : 6 ou 13.

A solution simple

Pour contourner ce problème, on peut supprimer quelques nombres aléatoires générés immédiatement après srand(). En faisant cela, l'entropie des nombres aléatoires suivants est augmentée, permettant une plage de valeurs plus large.

Voici le code modifié :

int main(int argc, const char * argv[])
{
    srand(time(NULL));
    
    // Discard the first few random numbers to eliminate the bias
    for (int i = 0; i < 10; ++i)
        rand();
    
    cout << rand() % 14;
    return 0;
}
Copier après la connexion

En supprimant les 10 premiers nombres aléatoires, vous éliminez efficacement le biais introduit par le multiplicateur défectueux du MCG RNG.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal