2010-12-10 52 views
9

Je fais un RPG en C++ basé sur du texte et j'essaie de comprendre comment résoudre les dégâts que l'ennemi vous inflige. Mon idée est quelque chose comme ça.C++ | Générer un pseudo-numéro entre 10 et 20

Damage done = randomIntBetween10and20 * enemyLevel

De cette façon, il ne frappe pas toujours pour un montant fixe à chaque fois et permet qu'il y ait Attaques critiques (Par exemple, si le succès est au-dessus 15 je classe cela comme un coup critique)

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

+0

est votre problème de la génération de nombres aléatoires? Jetez un oeil ici: http://stackoverflow.com/questions/3786389/write-ac-function-that-generates-one-random-or-number-or-pair-of-random-numbers/3786809#3786809 –

+0

Ahhh , Je vois. Je vous remercie. –

+10

Est-ce mauvais que j'ai d'abord lu RPG comme Rocket Propelled Grenade? –

Répondre

26

Vous devriez omettre le mot "vraiment" du titre, parce que vous ne le pensez probablement pas. Vous voulez probablement juste un numéro pseudo-aléatoire. Le vrai hasard est pratiquement impossible à réaliser avec un ordinateur personnel. L'extrait suivant vous donnera un numéro de pseudo-aléatoire dans la gamme 10..19 inclusive:

#include<cstdlib> 
#include<ctime> 

// ... 
srand(time(0)); 
int r = rand() % (20 - 10) + 10; 

Si vous souhaitez inclure 20 dans la gamme alors c'est une gamme de 11 numéros:

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

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

+0

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

+3

Plusieurs PC ont en réalité un flux d'entrée aléatoire basé sur le bruit thermique, qui inclut le caractère aléatoire réel. Voir http://en.wikipedia.org/wiki/Hardware_random_number_generator –

1

utilisation srand() pour initialiser le générateur de nombres aléatoires:

sand(time(NULL)); 

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

utiliser ensuite la fonction rand() pour générer une séquence de nombres aléatoires.

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

+1

Pas vraiment aléatoire. –

+2

@Noah Roberts: donc, pour un RPG, devons-nous utiliser des RNG sécurisés au chiffrement? <_ < –

+2

@Noah: D'accord, mais ne devrait-on pas commencer à attaquer avec un couteau plutôt qu'avec une hache de combat de niveau 5? – John

0

Ce lien doit vous aider à générer des nombres aléatoires dans une limite en C++ http://www.codeguru.com/forum/showthread.php?t=378879

+1

pas vraiment aléatoire. –

+0

@Noah Roberts: sur les systèmes/bibliothèques sains, la fonction rand() est liée à un pool d'entropie, alimenté par des bits aléatoires de l'environnement. approprié pour la grande majorité des cas, même la plupart des tâches crypto. certainement assez aléatoire pour un match. – Javier

+0

@Javier: Vous voulez dire rand() de la bibliothèque C, ou une autre méthode aléatoire? –

1

La seule façon de « générer » un nombre vraiment aléatoire est par l'interaction avec un facteur environnemental qui est au hasard. Ce site offre un service qui fait pour vous: http://www.random.org/

+0

Heureux de voir les gens comprendre la différence entre les nombres vrais et pseudo-aléatoires :) – jopasserat

4

Le générateur stdlib de nombres aléatoires serait un endroit correct pour commencer:

#include <stdlib.h> 
#include <time.h> 

srand(time(NULL)); // initialize the RNG 
int poll = rand() % 20; // random number between 0 and 19 inclusive 

Finalement, vous aurez envie de commencer à utiliser un RNG plus aléatoire. Codage du jeu complet a un assez décent pour vous aider à démarrer.

+1

Pas vraiment aléatoire. –

+8

Notez que 'srand' devrait être appelé ** UNE FOIS ** et plus jamais! (Pas à chaque fois) –

+0

@Noah: Aucun RNG n'est vraiment "vraiment" aléatoire. Tous sont seulement pseudo-aléatoires. Pour ce qu'il demande, l'une ou l'autre de ces options serait "assez aléatoire". –

6

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

Si vous ne disposez pas encore du support C++ 11, utilisez boost::random. Le nouveau std::random est basé sur boost::random, donc c'est fondamentalement la même chose. La documentation a plusieurs exemples, y compris Generating integers in a range.

L'une des options offertes est la Mersenne Twister (mt19937), qui est un bon générateur de nombres pseudo-aléatoires.

Comme la plupart des autres suggestions, ceci est pseudo-aléatoire. Obtenir un vrai hasard est plus difficile, mais vous n'en avez pas besoin pour un RPG, n'est-ce pas?(Pour les nombres aléatoires cryptographiquement forts, considérez OpenSSL ou, sous Windows, CryptoAPI.)

+1

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

+0

Meh, c'est proche. Que diriez-vous de "version à venir?" J'utilise 'std :: random' tout le temps dans MSVC et je sais que' gcc' 4.5 le supporte aussi. – Nate

2

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

Mais attention, True Chaos ne signifie pas que vous avez exactement la même chance de générer une sortie aléatoire possible .

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

Je viens de vous faire savoir ceux que j'avais gardés et trouvés utiles. Bien sûr, puisqu'ils ont besoin d'une graine, ils sont pseudo chaos. 1/pour le nombre flottant chaotique entre -1 et 1: calculer la fonction f (x) = cos (exp (x)). exp() se développe si vite, qu'après très peu d'itérations, ce qui sort de cos() est le chaos.

2/le transformateur boulanger: numéro chaotique entre 0 et 1: prendre un nombre, le multiplier par deux, et encore, quand il est supérieur à 1, soustraire quelque chose pour qu'il revienne entre 0 et 1. explication plus précise The Baker Transform.

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

Pour l'application à votre gamme 10-20, bien sûr vous étirez/étendez la gamme chaotique (0; 1) ou (-1; 1) en multipliant et en décalant ainsi la sortie en fonction de vos besoins. ;-)

2

La méthode qui utilise le module (%) n'est pas un bon choix car la distribution est désactivée. Cela vaut mieux:

double GetRandom(double Min, double Max) 
{ 
    return ((double(rand())/double(RAND_MAX)) * (Max - Min)) + Min;  
} 

Vous devrez inclure algorithm et interroger le générateur avec srand.

Bien sûr, ce n'est que pseudo-aléatoire. Vous ne serez pas en mesure d'obtenir des résultats vraiment aléatoires, en particulier avec rand.

+0

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

+0

@GregS Qu'est-ce qui ne va pas? Je suis prêt à y remédier, mais je ne suis pas sûr de savoir quel est le problème. – Maxpm

+0

@GregS Peu importe, j'ai trouvé le problème. – Maxpm

0

regarder ceci, il pourrait être utile:

// random numbers generation in C++ using builtin functions 
#include <iostream> 

using namespace std; 

#include <iomanip> 

using std::setw; 

#include <cstdlib> // contains function prototype for rand 

int main() 
{ 
// loop 20 times 
for (int counter = 1; counter <= 20; counter++) { 

    // pick random number from 1 to 6 and output it 
    cout << setw(10) << (1 + rand() % 6); 

    // if counter divisible by 5, begin new line of output 
    if (counter % 5 == 0) 
     cout << endl; 

} 

return 0; // indicates successful termination 

} // end main