2009-10-20 6 views
3

Je sais que C# a la classe Random et probablement quelques classes dans LINQ pour le faire, mais si je devais écrire mon propre code pour sélectionner aléatoirement un élément d'une collection sans utiliser de version intégrée .NET objets, comment cela serait-il fait?Conception d'une classe aléatoire personnalisée

Je ne peux pas sembler clouer la logique nécessaire pour cela - comment dirais-je au système quand arrêter une itération et sélectionner la valeur actuelle - au hasard?

EDIT: Ceci est une question hypothétique. Ceci n'est pas lié à un problème de codage de production. Je suis juste curieux.

Merci

+0

Ils sont vraiment utiles. :) –

Répondre

0

Vous devez utiliser une graine, quelque chose fourni semi-aléatoire par l'ordinateur lui-même. Peut-être utiliser une résolution très fine et utiliser les dernières microsecondes lorsque la méthode est appelée. Cela devrait être assez aléatoire pour générer quelque chose de 00 à 99, vous pouvez alors partir de là.

+0

Ceci est complètement inutile; La classe aléatoire de C# fait déjà ceci ou quelque chose de similaire. Si vous deviez écrire du code à cet effet et que vous introduisiez la graine dans la classe Random, votre code serait complètement redondant. – Timwi

+1

Je sais .NET a une classe aléatoire mais il a semblé demander comment il pourrait écrire sa propre classe aléatoire ... – Matt

0

Il semble que votre problème ne consiste pas à calculer un nombre aléatoire, mais à savoir comment utiliser ce nombre aléatoire pour sélectionner un élément dans une liste. En supposant que vous pouvez créer un nombre aléatoire d'une manière ou d'une autre, tout ce que vous devez faire est de l'utiliser comme argument pour l'indexeur de la liste.

int index = customRandomGenerator.Next(); 
var selection = items[index]; 

Si l'on suppose que votre présupposé d'avoir à parcourir la liste est correcte (ou la collection ne dispose pas d'un indexeur) alors vous pouvez faire:

int index = customRandomGenerator.Next(); 
Item selection = null; 
for (int i = 0; i < items.Length; i++) 
{ 
    if (i == index) 
    { 
    selection = items[i]; 
    break; 
    } 
} 
0

La seule vraie « cryptographiquement forte » Générateur de nombres aléatoires dans le .Net Framework est dans System.Cryptography.RandomNumberGenerator - exécutez cela via Reflector pour voir ce que fait? En regardant votre problème, vous aurez besoin de connaître le nombre de la collection sinon vous ne pourrez jamais récupérer un élément - vous devrez spécifier une valeur de début et de fin pour dessiner des nombres aléatoires - la classe Random fonctionnera mieux - passez par le réflecteur .

4

La sélection d'un élément aléatoire d'une collection peut être effectuée comme suit.

Random r = new Random(); 
int randomIndex = r.Next(0, myCollection.Size -1); 
var randomCollectionItem = myCollection[randomIndex]; 

Sauf si vous avez une très bonne raison, écrire votre propre générateur aléatoire n'est pas nécessaire.

+0

C'est exactement comment cela devrait être fait. – Timwi

0

Eh bien, je jamais pensé à mettre en œuvre moi-même comme il semble que de réinventer la roue, mais vous pouvez jeter un oeil sur cet article wikipedia, espérons qu'il vous aide à faire ce que vous voulez

Random Number Generator

2

Il y a beaucoup pseudo-random number generators. Ils ne sont pas vraiment aléatoires, mais ils sont de qualité différente, se distinguant par leurs propriétés statistiques et séquentielles et à quoi ils sont applicables.

Cela dépend beaucoup de "comment vous en avez besoin au hasard". S'il a juste besoin de « regarder au hasard à un être humain », générateurs simples qui ressemblent:

rnd = seed; // some starting value 
rnd = (a * rnd + b) % c; // next value 
... 

Pour des valeurs bien choisies de a, b et générateurs cCes sont ok pour les tests statistiques simples. Une discussion détaillée et des valeurs communes pour ces you find here.


Une approche intéressante est de collecter autant de données « externes » possible - comme le temps entre les mouvements de pressions sur les touches souris, la durée du disque se lit comme suit, etc. -, et utiliser un algorithme qui accumule aléatoire tout en rejetant la dépendance. C'est mathématiquement difficile (IIRC il n'y a pas si longtemps, une attaque critique a émergé sur la base de l'un d'entre eux n'étant pas aussi aléatoire que pensé).


Seulement très peu d'applications spéciales utilisent une source de matériel externe vraiment aléatoire - quoi que ce soit entre un amplificateur ouvert et imput désintégration radioactive.

3

Mon conseil est de ne pas le faire. Quelle que soit la raison que vous pensez avoir pour ne pas vouloir utiliser la bibliothèque intégrée, je suis sûr que vous avez mal compris quelque chose. Merci de retourner à la planche à dessin.

Tous les conseils ci-dessus sont techniquement précis, mais c'est un peu comme donner un manuel de chimie à quelqu'un qui veut raffiner sa propre huile à utiliser dans sa voiture. Pourquoi ne voulez-vous utiliser aucun objet .NET?

Questions connexes