可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I am making a text-based C++ RPG and I am trying to figure out how to work out the amount of damage that the enemy hits you for. My idea is something like this.
Damage done = randomIntBetween10and20*enemyLevel
This way it doesn't always hit for a set amount each time and allows there to be Critical Strikes (For example, if the hit is above 15 I would class that as a Critical Strike)
I'm new to C++ so I'm not quite sure how I can do this, any help would be greatly appreciated.
回答1:
You should omit the word "truly" from the title, because you probably don't mean it. You probably just want a pseudorandom number. True randomness is virtually impossible to achieve with a personal computer. The following snippet will give you a pseudorandom number in the range 10..19 inclusive:
#include<cstdlib>
#include<ctime>
// ...
srand(time(0));
int r = rand() % (20 - 10) + 10;
If you want to include 20 in the range then this is a range of 11 numbers:
int r = rand() % (21 - 10) + 10
回答2:
A good choice would be std::random
, the random number generator that’s built-in to C++.
If you don’t have C++11 support yet, use boost::random
. The new std::random
is based on boost::random
, so it’s basically the same thing. The documentation has several examples, including Generating integers in a range.
One of the options offered is the Mersenne Twister (mt19937
), which is a good general-purpose pseudo-random number generator.
Like most of the other suggestions, this is pseudo-random. To get true randomness is more difficult—but you don’t need that for an RPG, right? (For cryptographically-strong random numbers, consider OpenSSL or, on Windows, CryptoAPI.)
回答3:
The stdlib random number generator would be an okay place to start:
#include <stdlib.h>
#include <time.h>
srand(time(NULL)); // initialize the RNG
int poll = rand() % 20; // random number between 0 and 19 inclusive
Eventually, you'll want to start using a more random RNG. Game Coding Complete has a pretty decent one to get you started.
回答4:
As others said, maybe rand() will be really sufficient for you.
What is important is the seed used to initialise the pseudo random number generator ( the call to srand() is the seed)
But beware, True Chaos doesnt mean that you have exactly the same chance to generate any possible random output.
Ten years ago I have played with stochastic sound generation.
I needed several sources of chaos.
I just let you know those which I had kept and found useful. of course since they need a seed, they are pseudo chaos.
1/for chaotic float number between -1 and 1: compute the function f(x) = cos(exp(x)). exp() grows so fast, that after really few iteration, what goes out from cos() is chaos.
2/the baker transform: chaotic number between 0 and 1: take a number, multiply it by two, and again, when it is superior to 1, substract something so as it goes back betwen 0 and 1. A much more precise explanation The Baker Transform.
But I think rand() and srand() will satisfy you.
For applying to your range 10-20, of course you stretch/scale the chaotic range (0;1) or (-1;1) by multiplying and offsetting so as the ouput fits your need. ;-)
回答5:
The method that uses modulus (%
) isn't a good choice because the distribution is off. This is better:
double GetRandom(double Min, double Max)
{
return ((double(rand()) / double(RAND_MAX)) * (Max - Min)) + Min;
}
You will need to include algorithm
and seed the generator with srand
.
Of course, it's only pseudo-random. You won't be able to get truly random results, especially with rand
.
回答6:
The only way to 'generate' a truly random number is through the interaction with some environmental factor that is random. This website provides a service that does that for you: http://www.random.org/
回答7:
Use srand() to initialise the random number generator:
sand(time(NULL));
http://www.cplusplus.com/reference/clibrary/cstdlib/srand/
Then use the rand()
function to generate a sequence of random numbers.
http://www.cplusplus.com/reference/clibrary/cstdlib/rand/
回答8:
This link must help you to generate random numbers within a limit in C++
http://www.codeguru.com/forum/showthread.php?t=378879
回答9:
look this out, it might be helpful:
// 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