9
votes

C ++ | Générer un pseudo nombre compris entre 10 et 20

Je fais un RPG C ++ basé sur le texte et j'essaie de déterminer comment déterminer le montant des dommages que l'ennemi vous frappe. Mon idée est quelque chose comme ça.

Dommages causés = RandomintBetween10and20 * Enemylevel

De cette façon, il ne frappe pas toujours pour une quantité définie à chaque fois et permet d'y avoir grèves critiques (par exemple, si le coup est supérieur à 15, je serais en cours de grève aussi critique)

Je suis nouveau à C ++, donc je ne suis pas tout à fait sûr de savoir comment je peux faire cela, toute aide serait grandement appréciée.


5 commentaires

Votre problème est-il la génération de nombres aléatoires? Regardez ici: Stackoverflow.com/questions/3786389/...


Est-il mauvais que je lisais d'abord RPG comme grenade propulsée de fusée?


@Billy Oneal, ce n'est pas mauvais du tout ... c'est basé sur le texte. Au moins que le combattant subira de graves blessures ASCII.


Avez-vous vraiment voulu dire vraiment? Si tel est le cas, vous devez avoir beaucoup d'expérience avec C ++. Utiliser le bruit du microphone peut être rentable :)


Quelqu'un veuillez éditer le titre de la question. Comme beaucoup de gens ont souligné cette question n'a rien à voir avec un véritable générateur de nombres aléatoires (TRNG).


8 Réponses :


1
votes

Utilisez Srand () pour initialiser le générateur de nombres aléatoires: xxx

http://www.cplusplus.com/reference/clibrary/cstdlib/srand/

puis utilisez la fonction rand () générer une séquence de nombres aléatoires.

http: // www .cplusplus.com / Référence / Clibrary / CSTDLIB / RAND /


4 commentaires

@Noah Roberts: Donc, pour un RPG, avons-nous besoin d'aller avec des rngs crypto-sécurité? <_ <


@NOAH: D'accord, mais ne devrait-on pas commencer à attaquer cela avec un couteau plutôt que d'une hache de bataille de niveau 5?


Ajouter Srand () pour A +1. Pas ou sable (). Srand () et Rand () doivent être utilisés ensemble.


Appréciez votre aide Martin. Merci! Passe un bon weekend.



1
votes

Le seul moyen de "générer" un nombre vraiment aléatoire passe par l'interaction avec un facteur environnemental aléatoire. Ce site Web fournit un service qui vous fait pour vous: http://www.random.org/


1 commentaires

Heureux de voir les gens comprendre la différence entre les chiffres réels et pseudo aléatoires :)



4
votes

Le générateur de nombres aléatoires STDLIB serait un lieu correct pour démarrer: xxx

finalement, vous voudrez commencer à utiliser un RNG plus aléatoire. codage de jeu complet a une expérience assez décente pour vous aider à démarrer.


20 commentaires

Notez que srand doit être appelé une fois et plus jamais! (Pas à chaque fois)


@Noah: aucun rng n'est vraiment "vraiment" aléatoire. Tous ne sont Psuedo-aléatoire. Pour ce qu'il demande, l'une de ces options serait "assez aléatoire".


Merci, c'est ce dont j'ai besoin. Apparemment, je ne peux pas définir une réponse acceptée pendant 6 minutes supplémentaires, alors j'attendrai.


@ZAC: Pas vrai. Voir la réponse de Noé. La plupart des machines font ont des moyens spécifiques au système de devenir vrai aléatoire (bien que pas aussi bien que quelque chose comme aléatoire.org). Par exemple, / dev / aléatoire sur des boîtes Linux est généré à partir de tel./


@Billy: / dev / aléatoire et même aléatoire.org ne sont que des générateurs de nombres pseudo-aléatoires. Si vous remarquez, Room.org indique qu'il offre des nombres aléatoires «vrais» qui sont «meilleurs» que d'autres générateurs de nombres pseudo-aléatoires. Meilleur générateur de nombres aléatoires, sûr ... vraiment aléatoire, nope. Mais nous sommes allés sur une énorme tangente ici.


@ZAC: Je suis désolé, mais vous êtes incorrect. Les deux sources que je mentiontent sont vraiment aléatoires. C'est pourquoi la lecture de / dev / aléatoire est incroyablement lente, car il n'y a pas beaucoup de hasard à avoir eu sur un PC typique, tandis que / dev / urandom est rapide, car il est rapide, car il est rapide Pseudorandom.


@Billy: Déteste de vous le casser, mais vous êtes incorrect. Il n'y a qu'un premier générateur de nombres aléatoires réelle connu "algorithme" (j'utilise le terme très lâchement là-bas) que nous avons trouvé jusqu'à présent. Chaque solution logicielle est pseudo-aléatoire à des degrés divers. Ce n'est pas parce qu'un générateur de nombres pseudo-aléatoires est meilleur qu'un autre, ne le rend pas vraiment aléatoire: EN.Wikipedia.org/wiki/...


@ZAC: Je ne vois pas comment ce lien prouve votre point. Tout ce qu'il dit, c'est qu'une machine déterministe ne peut pas produire de vrais nombres aléatoires. Ni / dev / aléatoire ni aléatoire.org sont générés via des processus déterministes.


@ZAC: Le site aléatoire.org n'est pas une solution logicielle.


@Billy: Vrai aléatoire ne peut pas être calculé. Donc, à moins qu'un PC standard ait un moyen de mesurer certains phénomènes physiques (pour obtenir l'entropie requise) que je ne suis pas au courant, alors / dev / aléatoire doit calculer un numéro Randm et, comme tel, un PRNG et donc pas vraiment aléatoire.


@Zac: afaik / dev / aléatoire prend en entropie de divers éléments matériels "décontractés" (le pool d'entropie), par ex. Des mouvements de la souris, des horaires de KeyPress, etc. Voyez en.wikipedia.org/wiki// Dev / Random # Linux , en.wikipedia.org/wiki/tropy_pool#USURE_OBSERVED_EVENT < / a>


@Martin York: Oui, la plupart des PC n'ont pas de nombreuses sources d'entropie, c'est pourquoi la lecture d'une quantité substantielle d'informations provenant de / dev / aléatoire prend pour toujours. La plupart des ordinateurs ont toutefois des installations de génération aléatoires limitées, par exemple, par la dérive de l'horloge ou le bruit thermique.


@Billy: aléatoire.org et Ernie Utilisez du matériel pour mesurer les phénomènes physiques (qui sont apparemment Aléatoire). Vous pouvez bien sûr obtenir Matériel approprié à brancher sur votre PC, mais il a un coût associé que la plupart des gens ne sont pas disposés à payer pour (faire la plupart des gens ont vraiment besoin de véritables aléateurs). Donc, oui PC peut générer des nombres vraiment aléatoires, mais la plupart des fabricants de PC ne sont pas disposés à ajouter au coût d'un PC pour quelque chose que la plupart des gens ne se soucient pas. / dev / aléatoire est lent car il essaie d'être bon.


@Billy: Si vous voulez continuer cette discussion, posez la question "/ dev / aléatoire" vraiment aléatoire? "


@Martin: Je n'ai pas besoin de. EN.Wikipedia.org/wiki//dev/random#Linux Déjà l'explique jolie putain bien.


@Billy: Oui, car Wikipedia est une bonne source d'informations précise écrite par les personnes les plus compétentes sur le terrain! J'adore Wikipedia comme point de départ pour la recherche pour trouver d'autres sources autorité , mais comme source, ce n'est pas une bonne (même le fondateur de Wikipedias fait cette énoncé exacte).


@Billy: J'ai lu la page Wikipedia. Qui a fourni Ce lien dans la section de référence. Cela explique que / dev / aléatoire utilise un bruit aléatoire du PC pour semer le générateur de nombres aléatoires. Alors que dois-je croire?


@Martin: Si vous ne pouvez pas le modéliser comme autre que aléatoire, il est aléatoire.


@Martin: Peut-être plus approprié qu'un lien Ernie pour les personnes qui souhaitent peut-être ajouter du matériel RNG à un PC: .wikipedia.org / wiki / ... et oui, initialiser un PRNG avec une graine vraiment aléatoire peut augmenter le débit binaire sans sacrifier (beaucoup) aléatoire.


@Gregs: Oui, c'est ce que le monde crypto croit croire. S'il vous plaît n'hésitez pas à poser la question à ce sujet. Voir si la majorité croient que. @Ben: Bien sûr, je suis d'accord avec vous, il est meilleur que Rand () qui n'était pas pointu. @Billy comme argumenter que / dev / aléatoire était vraiment aléatoire. Whoops mon deuxième lien était censé être celui que vous avez fourni. Merci.



27
votes

Vous devez omettre le mot "vraiment" du titre, car vous ne le signent probablement pas. Vous voulez probablement juste un nombre pseudorandom strong>. Le vrai aléatoire est pratiquement impossible à réaliser avec un ordinateur personnel. L'extrait suivant vous donnera un nombre pseudorandom dans la plage 10..19 inclus: xxx pré>

si vous souhaitez inclure 20 dans la plage, il s'agit d'une plage de 11 numéros: P >

int r = rand() % (21 - 10) + 10


9 commentaires

En fait, c'est exactement ce dont j'ai besoin. Merci beaucoup!


Au moins celui-ci mentionne la différence. +1


Toutes quelques PC ont en fait un flux d'entrée aléatoire basé sur le bruit thermique, qui inclut une véritable aléatoire. Voir en.wikipedia.org/wiki/hardware_random_number_generator


Vous devez les demander spécifiquement. La fonction rand () est pseudo-aléatoire.


N'oubliez pas. Seulement appeler Srand () Une fois dans une application.


@Ben: Pour une définition appropriée de "vrai aléatoire", bien sûr. ;)


@JAlf: Le bruit thermique n'est pas un gaussien blanc non corrélé, si c'est ce que vous en obtenez, mais il y a du bruit non corrélé mélangé au-dessus des autres choses. Et je devinerais que HW RNG est assez bien équipé pour séparer cela.


@Noah: Oui, vous avez besoin de code différent. Mon commentaire a été dirigé contre la déclaration de Wilhelmtell selon laquelle "le vrai aléatoire est pratiquement impossible à réaliser avec un ordinateur personnel", pas l'extrait de code.


Je n'ai qu'un seul problème avec cet extrait: je crains que cela soit biaisé. Si nous supposons que rand () est créé (pour commencer par), alors rand ()% n est légèrement plus susceptible de produire 0 que donner n-1 , sauf si n-1 est un diviseur de la valeur maximale que rand peut générer (ou quelque chose comme ça: p) . Si n est petit, ce n'est pas si notable ( 1 000 0001 0 pour 1 000 000 10 par exemple, serait presque créé), mais avec n La croissance de la question est de plus en plus importante. Je ne sais pas un moyen d'obtenir une distribution uniforme dans 0..n dans O (1) fois.



7
votes

Un bon choix serait std :: aléatoire , le générateur de nombres aléatoires intégré à C ++.

Si vous n'avez pas encore de support C ++ 11, utilisez boost :: aléatoire . Le nouveau std :: aléatoire est basé sur boost :: aléatoire , donc c'est fondamentalement la même chose. La documentation comporte plusieurs exemples, y compris Générer des entiers dans une plage .

Une des options proposées est la Mersenne Twister ( MT19937 ), qui est un bon générateur de nombres pseudo-aléatoires à usage général.

Comme la plupart des autres suggestions, c'est pseudo-aléatoire. Pour que le vrai aléatoire soit plus difficile, mais vous n'avez pas besoin de cela pour un RPG, non? (Pour des nombres aléatoires cryptographiquement forts, envisagez OpenSSL ou, sous Windows, cryptoapi .)


2 commentaires

Eh bien, je n'appellerais pas C ++ 0x la "dernière version", étant donné que ce n'est pas encore c ++.


Meh, c'est proche. Que diriez-vous, "Version à venir?" J'utilise std :: aléatoire tout le temps dans msvc et je sais gcc 4.5 le supporte également.



2
votes

Comme les autres ont dit, peut-être que Rand () sera vraiment suffisant pour vous. Ce qui est important, c'est la graine utilisée pour initialiser le générateur de nombres pseudo aléatoires (l'appel à Srand () est la graine)

Mais méfiez-vous, le vrai chaos ne signifie pas que vous avez exactement la même chance de générer une puissance aléatoire possible.

Il y a dix ans, j'ai joué avec une génération sonore stochastique. J'avais besoin de plusieurs sources de chaos.

Je vous tiens tout simplement que vous savez ceux que j'avais maintenus et trouvés utiles. Bien sûr, car ils ont besoin d'une graine, ils sont pseudo-chaos.

1 / pour le numéro de flotteur chaotique entre -1 et 1: calculer la fonction f (x) = cos (exp (x)). exp () croît si vite, après que vraiment peu d'itération, ce qui sort de cos () est le chaos.

2 / boulanger transformée: nombre chaotique entre 0 et 1: prendre un certain nombre, multiplier par deux, et encore une fois, quand il est supérieur à 1, soustraire quelque chose de manière qu'il remonte Situés entre 0 et 1. Un beaucoup plus explication précise Baker Transformer .

Mais je pense que rand () et srand () vous satisfaire.

Pour l'application de votre gamme 10-20, bien sûr, vous étirer / échelle la plage chaotique (0; 1) ou (-1, 1) en multipliant et en compensation afin que le ouput correspond à votre besoin. ; -)


0 commentaires

2
votes

La méthode qui utilise module (% ) n'est pas un bon choix car la distribution est éteinte. C'est mieux: xxx

Vous devrez inclure algorithme et graine le générateur avec srand .

de Cours, c'est seulement pseudo-aléatoire. Vous ne pourrez pas obtenir des résultats vraiment aléatoires, en particulier avec rand .


2 commentaires

Cela semble sérieusement buggy. Ou c'est juste moi? J'aime où tu vas mais tu n'es pas encore là.


@Gregs ce qui ne va pas avec ça? Je suis prêt à le réparer, mais je ne suis pas sûr de ce que le problème est.



0
votes

Regarde ceci, il pourrait être utile: xxx


0 commentaires