2010-12-11 28 views
0

Je développe un programme dans lequel j'ai besoin de générer un nombre aléatoire à partir d'un tableau d'octets qui est reçu d'un périphérique qui génère des nombres aléatoires. Le problème est; le périphérique envoie les nombres aléatoires sous forme de flux d'octets, et j'en ai besoin pour générer un entier entre une certaine valeur. En d'autres termes:Comment générer un entier aléatoire entre certaines valeurs d'un tableau d'octets

int GenerateRandom(int min, int max, byte[] rndr) { 
//Do something with the bytes to make a random integer here between min and max 
} 

Non, je ne peux pas utiliser la classe intégrée aléatoire dans .NET, parce que le programme sera utilisé pour chiffrer des informations sécurisées, et un générateur de nombres pseudo-aléatoires ne serait pas acceptable.

+0

@Mitch: Pouvez-vous poster un lien vers la question en double? –

+0

Besoin d'une réponse spécifique pour C# – IDWMaster

+0

Pourriez-vous expliquer ce que vous voulez avec un exemple? –

Répondre

3

La classe source code pour la classe java.util.Random peut vous aider. Je sais, je sais, ce n'est pas le C#, mais ne le faites pas pour le moment. L'algorithme est le bit important: donné une source de bits aléatoires, génère un entier entre 0 et n. C'est plutôt trivial de convertir la plage [0..n] en [min..max].

Je suis sûr que vous pouvez implémenter le même algorithme en C# dans une quantité similaire de code: environ 12 lignes, y compris 2 accolades fermées et 2 lignes de validation d'entrée.

EDIT: La fonction nextInt(int n) est celle que vous voulez regarder.

EDIT2: Vous pouvez également utiliser un RNGCryptoServiceProvider ensemencé avec vos bits aléatoires de haute qualité. Cela peut être assez sûr pour vos besoins, surtout si vous pouvez réensemencer de temps en temps avec un nouveau caractère aléatoire de haute qualité. Il est intéressant de noter que le site Web msdn ne fonctionne pas correctement avec Chrome sous Linux. Qui aurait thunk?

+0

s'il a vraiment besoin d'un algorithme, l'implémentation de C# ne devrait pas s'avérer trop difficile. – ProfK

+0

Merci. Cela a fonctionné parfaitement. J'ai utilisé l'algorithme Java. – IDWMaster

0

Si vous avez besoin d'un nombre aléatoire cryptograïquement fort, le framework .NET a la classe RNGCryptoServiceProvider à cette fin.

GetBytes() Remplit un tableau d'octets avec une séquence cryptographiquement forte de valeurs aléatoires.

+0

RNGCryptoServiceProvider ne sera toujours pas aussi bon que la source d'aléatoire de l'OP. De la question: "un générateur de nombres pseudo-aléatoires ne serait pas acceptable". RNGCryptoServiceProvider est toujours pseudo-aléatoire, mais meilleur que la classe Random vanilla. –

0

Si ce tableau d'octets contient déjà un nombre aléatoire, vous pouvez l'utiliser comme valeur d'exemple. Dans cet exemple j'utilise les 4 premiers octets, vous pouvez le modifier pour n'importe quelle taille de mot applicable et lui faire faire pivoter des mots.

static int GenerateRandom(int min, int max, byte[] rndr) 
{ 
    int isamp = (int)(((uint)rndr[3] << 24) | ((uint)rndr[2] << 16) | ((uint)rndr[1] << 8) | ((uint)rndr[0])); 
    if (isamp < 0) 
     isamp += int.MaxValue; 
    double samp = isamp * 4.6566128752457969E-10; 
    return (int)(samp * (max - min)) + min; 
} 
+0

Cela n'aboutit pas à des valeurs également probables à partir de l'intervalle de sortie. – CodesInChaos

+0

Cela dépend de la distribution des graines d'entrée. C'est aussi distribué que l'est l'entrée. – Tergiver