2010-01-24 4 views
0

Quelqu'un pourrait-il suggérer un bon moyen de prendre un global valeur de graine par ex. "Hello World" et en utilisant cette valeur pour rechercher des valeurs dans des tableaux ou des tableaux. Je pense en quelque sorte à ce jeu spatial classique de "Elite" où il y avait différents attributs pour les planètes mais qui n'étaient pas aléatoires, simplement dérivés de la valeur de départ de l'univers. Je pensais MD5 sur la valeur d'entrée, puis en utilisant des octets du hachage, les transformant en entiers et les modulant en index acceptables pour les tables de recherche, mais je soupçonne qu'il doit y avoir un meilleur moyen? J'ai lu quelque chose à propos des twisters de Mersenne mais peut-être que ce serait exagéré. J'espere pour quelque chose qui donnera une bonne distrubution sur les valeurs dans mes tables de recherche. par exemple. Rouge, Orange, Jaune, Vert, Bleu, VioletMéthodologie des semences pseudo-aléatoires pour les tables de consultation

Je tiens également à souligner que je ne recherche pas des valeurs aléatoires mais des valeurs cohérentes à chaque fois.

Mise à jour: Peut-être que j'ai de la difficulté à exprimer mon propre domaine de problème. Voici un exemple d'un site qui utilise des générateurs et peut générer un nombre X de valeurs: http://www.seventhsanctum.com

critères supplémentaires

Je préfère travailler à partir des principes plutôt que d'utiliser les fonctions de la bibliothèque comme le système. au hasard

Répondre

2

Mon approche serait d'utiliser votre clé comme une graine pour un générateur de nombres aléatoires

public StarSystem(long systemSeed){ 
    java.util.Random r = new Random(systemSeed); 
    Color c = colorArray[r.nextInt(colorArray.length)]; // generates a psudo-random-number based from your seed 
    PoliticalSystem politics = politicsArray[r.nextInt(politicsArray.length)]; 
    ... 
} 

pour une graine donnée cela produira la même couleur et le même système politique à chaque fois. Pour obtenir la graine de départ à partir d'une chaîne, vous pouvez simplement utiliser MD5Sum et saisir le premier/dernier 64 bits pour votre long, l'autre approche serait d'utiliser un numérique pour chaque plante. Elite a également généré les noms de chaque système en utilisant son générateur pseudo-aléatoire.

for(long seed=1; seed<NUMBER_OF_SYSTEMS; seed++){ 
    starSystems.add(new StarSystem(seed)); 
} 

En réglant la graine à une valeur connue chaque fois que le hasard retourne la même séquence à chaque fois qu'il est appelé, c'est pourquoi lorsque vous essayez de bonnes valeurs aléatoires une bonne graine est très important. Cependant, dans votre cas, une graine connue produira les résultats que vous recherchez.

Le C# est équivalent

public StarSystem(int systemSeed){ 
    System.Random r = new Random(systemSeed); 
    Color c = colorArray[r.next(colorArray.length)]; // generates a psudo-random-number based from your seed 
    PoliticalSystem politics = politicsArray[r.next(politicsArray.length)]; 
    ... 
} 

avis une différence? non

+0

Les exemples sont en Java et utilisent Java Random.nextInt (int maxValue) qui renvoie un entier dans la plage 0-maxValue.Toutes les autres langues de flux principal ont l'équivalent. –

+1

L'autre chose à noter dans ma réponse est que C# et la classe de nombres aléatoires de Java ont une méthode qui retournera un entier dans une plage donnée. dans ce cas entre 0 et la longueur du tableau, vous offrant une traduction facile et sûre entre un nombre aléatoire et une recherche dans votre liste de couleurs. Plus formellement 0 <= NextRandom

+0

Merci, je suis sûr que cela va fonctionner. J'espérais que quelqu'un connaissait une réponse tout en un basé sur les premiers principes. c'est-à-dire le hash et le pseudo-aléatoire tout en algorithme un mais peut-être que je ne voyais pas le bois pour les arbres – PeanutPower

1

De nombreux générateurs de nombres aléatoires génèrent la même séquence avec la même valeur de départ, il semble donc que tout ce que vous devez faire est de convertir votre nom en un nombre. Il y a un certain nombre de fonctions de hachage qui le feront.

Question supplémentaire: Est-il nécessaire que toutes les chaînes uniques génèrent des hachages uniques et donc (probablement) des séquences pseudo-aléatoires uniques. ?

+0

Les collisions de Nope sont bien – PeanutPower

Questions connexes