Comment retourner les bits du centre du générateur de nombres aléatoires?

J’ai une fonction random_rand () qui produit un nombre aléatoire compris entre 0 et RANDOM_RAND_MAX. RANDOM_RAND_MAX est défini sur 65535.

Je voudrais utiliser les bits du milieu du résultat de random_rand () au lieu des bits de poids faible afin de pouvoir améliorer la randomiztion.

Pourriez-vous s’il vous plaît me montrer un moyen rapide de le faire.

Merci

C’est méchant.

Les générateurs congruentiels linéaires fonctionnent de telle sorte que la partie “la plus aléatoire” comprend les bits de poids faible. Une très célèbre implémentation de rand IBM il y a quelques décennies a permuté les parties les plus hautes et les plus basses après un dessin, ce qui a complètement détruit le générateur!

Alors gardez les choses simples. Générez votre nombre aléatoire et extrayez les bits les moins significatifs en utilisant l’opérateur % ou un bitwise & : bien que cela introduise un biais statistique, les effets ne sont pas pires que ceux du générateur lui-même.

Quoi que vous fassiez, effectuez toujours des vérifications statistiques sur votre générateur pour vous assurer qu’il possède des propriétés statistiques adéquates. Au moment de la rédaction, le schéma de génération qui semble être le “meilleur” est le Twister Mersenne.

(Si vous voulez vraiment les bits du milieu, utilisez un mélange d’opérateur de décalage droit au niveau des bits >> et & .)

 result = (random_rand() >> 4) & 0xff 

Cela décale le résultat entier de quatre bits (détruisant les quatre premiers bits), puis le résultat logique avec AND avec le binary 0000000011111111 afin que seuls les 8 bits suivants soient utilisés.

Toutefois, lorsque vous devez recourir à de telles méthodes pour améliorer la qualité de votre générateur de nombres pseudo-aléatoires, vous devez plutôt envisager d’utiliser un meilleur PRNG. Le twister de mersenne , par exemple, est un très bon compromis entre performance et qualité.