2010-12-10 6 views
9

Estoy haciendo un juego de rol en C++ basado en texto y estoy tratando de encontrar la manera de calcular la cantidad de daño que el enemigo te golpea. Mi idea es algo como esto.C++ | Generando un pseudo número entre 10-20

El daño infligido = randomIntBetween10and20 * enemyLevel

De esta manera no siempre golpeado por una cantidad fija cada vez y permite que haya golpes críticos (por ejemplo, si el golpe es superior al 15 yo clasificaría que como un golpe crítico)

Soy nuevo en C++, así que no estoy muy seguro de cómo puedo hacer esto, cualquier ayuda sería muy apreciada.

+0

¿Su problema es la generación de números aleatorios? Eche un vistazo aquí: http://stackoverflow.com/questions/3786389/write-ac-function-that-generates-one-random-number-or-a-pair-of-random-numbers/3786809#3786809 –

+0

Ahhh , Ya veo. Gracias. –

+10

¿Es malo que primero leí RPG como Rocket Propelled Grenade? –

Respuesta

26

Debe omitir la palabra "verdaderamente" del título, porque probablemente no lo diga en serio. Probablemente solo desee un número pseudorandom. La verdadera aleatoriedad es prácticamente imposible de lograr con una computadora personal. El siguiente fragmento le dará un número pseudoaleatorio en el rango 10..19 incluido:

#include<cstdlib> 
#include<ctime> 

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

Si desea incluir 20 en el rango, entonces esto es una serie de 11 números:

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

En realidad, esto es exactamente lo que necesito. ¡Muchas gracias! –

+0

Al menos este menciona la diferencia. +1 –

+3

Bastantes PC tienen realmente un flujo de entrada aleatorio basado en el ruido térmico, que incluye aleatoriedad verdadera. Consulte http://en.wikipedia.org/wiki/Hardware_random_number_generator –

1

Uso srand() para inicializar el generador de números aleatorios:

sand(time(NULL)); 

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

continuación, utilizar la función de rand() para generar una secuencia de números aleatorios.

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

+1

No es verdaderamente aleatorio. –

+2

@Noah Roberts: ¿entonces, para un RPG necesitamos ir con RNG criptográficos? <_ < –

+2

@Noah: De acuerdo, ¿pero no debería uno comenzar a atacar esto con un cuchillo en lugar de un hacha de batalla de nivel 5? – John

0

Este enlace debe ayudar a generar números aleatorios dentro de un límite en C++ http://www.codeguru.com/forum/showthread.php?t=378879

+1

no es verdaderamente aleatorio. –

+0

@ Noah Roberts: en sistemas/bibliotecas sanos, la función rand() está vinculada a un conjunto de entropía, alimentación con bits aleatorios del entorno. Apropiado para la gran mayoría de los casos, incluso para la mayoría de las tareas de cifrado. definitivamente lo suficientemente aleatorio para un juego. – Javier

+0

@Javier: ¿Quieres decir rand() de la biblioteca C o algún otro método aleatorio? –

1

La única manera de 'generar' un número verdaderamente aleatorio es a través de la interacción con algún factor ambiental que es aleatorio. Este sitio web proporciona un servicio que lo hace por usted: http://www.random.org/

+0

Me alegra ver a las personas entender la diferencia entre los números verdaderos y pseudoaleatorios :) – jopasserat

4

El generador de números aleatorios stdlib sería un buen lugar para empezar:

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

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

Finalmente, tendrá que empezar a utilizar un generador de números aleatorios más al azar. Game Coding Complete tiene uno bastante decente para empezar.

+1

No es verdaderamente aleatorio. –

+8

Tenga en cuenta que 'srand' se debe llamar ** UNA VEZ ** y nunca más! (No todas las veces) –

+0

@Noah: Ningún RNG es realmente "verdaderamente" aleatorio. Todos son solo psuedo-aleatorios. Por lo que está preguntando, cualquiera de esas opciones sería "lo suficientemente aleatoria". –

6

Una buena opción sería std::random, el generador de números aleatorios que está integrado en C++.

Si aún no tiene soporte para C++ 11, use boost::random. El nuevo std::random se basa en boost::random, por lo que básicamente es lo mismo. La documentación tiene varios ejemplos, incluido Generating integers in a range.

Una de las opciones que se ofrecen es la Mersenne Twister (mt19937), que es un buen generador de números pseudoaleatorios de uso general.

Como la mayoría de las otras sugerencias, esto es pseudoaleatorio. Para obtener verdadera aleatoriedad es más difícil, pero no es necesario para un juego de rol, ¿verdad?(Para números aleatorios criptográficamente fuertes, considere OpenSSL o, en Windows, CryptoAPI.)

+1

Bueno, no llamaría a C++ 0x la "última versión", dado que aún no es C++. –

+0

Meh, está cerca. ¿Qué tal, "próxima versión?" Utilizo 'std :: random' todo el tiempo en MSVC y sé que' gcc' 4.5 también lo admite. – Nate

2

Como han dicho otros, tal vez rand() sea realmente suficiente para usted. Lo importante es la semilla utilizada para inicializar el generador de números pseudoaleatorios (la llamada a srand() es la semilla)

Pero cuidado, True Chaos no significa que tienes exactamente la misma posibilidad de generar cualquier salida aleatoria posible . Hace

diez años he jugado con estocástico de generación de sonido. Necesitaba varias fuentes de caos.

acabo de hacerle saber las que había mantenido y ha encontrado útil. por supuesto, ya que necesitan una semilla, son pseudo caos.

1/números de flotador caótica entre -1 y 1: calcular la función f (x) = cos (exp (x)). exp() crece tan rápido, que después de muy pocas iteraciones, lo que sale de cos() es caos.

2/the baker transform: número caótico entre 0 y 1: tome un número, multiplíquelo por dos, y de nuevo, cuando es superior a 1, resta algo así que se vuelve entre 0 y 1. Mucho explicación más precisa The Baker Transform.

pero creo rand() y srand() va a satisfacer.

Para aplicar a su rango 10-20, por supuesto, estirar/escalar el rango caótico (0; 1) o (-1; 1) multiplicando y compensando para que la salida se adapte a sus necesidades. ;-)

2

El método que utiliza el módulo (%) no es una buena elección porque la distribución está apagado. Esto es mejor:

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

Usted tendrá que incluir algorithm y la semilla del generador con srand.

Por supuesto, es sólo pseudo-aleatorio. No podrá obtener resultados verdaderamente aleatorios, especialmente con rand.

+0

Esto se ve seriamente con errores. ¿O solo soy yo? Me gusta a dónde vas pero todavía no estás allí. –

+0

@GregS ¿Qué tiene de malo? Estoy dispuesto a arreglarlo, pero no estoy seguro de cuál es el problema. – Maxpm

+0

@GregS No importa, encontré el problema. – Maxpm

0

mirar esto a cabo, podría ser útil:

// 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 
Cuestiones relacionadas