我正在制作一个基于文本的C ++ RPG,我正试图弄清楚如何计算敌人击中你的伤害量。我的想法是这样的。
伤害完成= randomIntBetween10and20 * enemyLevel
通过这种方式,它并不总是每次都达到设定的数量,并且允许致命一击(例如,如果命中率高于15,我会把它归类为致命一击)
我是C ++的新手,所以我不确定如何做到这一点,我们将非常感谢任何帮助。
答案 0 :(得分:26)
你应该从标题中省略“真实”这个词,因为你可能不是这个意思。您可能只需要一个伪随机数字。使用个人计算机几乎不可能实现真正的随机性。以下代码段将为您提供10..19(含)范围内的伪随机数:
#include<cstdlib>
#include<ctime>
// ...
srand(time(0));
int r = rand() % (20 - 10) + 10;
如果您想在范围中包含20,那么这是11个数字的范围:
int r = rand() % (21 - 10) + 10
答案 1 :(得分:6)
一个很好的选择是std::random
,它是C ++内置的随机数生成器。
如果您还没有C ++ 11支持,请使用boost::random
。新std::random
基于boost::random
,因此基本相同。该文档有几个示例,包括Generating integers in a range。
提供的选项之一是Mersenne Twister(mt19937
),它是一个很好的通用伪随机数生成器。
与大多数其他建议一样,这是伪随机的。要获得真正的随机性更难 - 但你不需要RPG,对吧? (对于加密强的随机数,请考虑OpenSSL或在Windows上CryptoAPI。)
答案 2 :(得分:4)
stdlib随机数生成器是一个可以开始的好地方:
#include <stdlib.h>
#include <time.h>
srand(time(NULL)); // initialize the RNG
int poll = rand() % 20; // random number between 0 and 19 inclusive
最终,您将要开始使用更随机的RNG。 游戏编码完成有一个相当不错的开始。
答案 3 :(得分:2)
正如其他人所说,也许rand()对你来说真的足够了。 重要的是用于初始化伪随机数生成器的种子(对srand()的调用是种子)
但要注意,True Chaos并不意味着您有完全相同的机会生成任何可能的随机输出。
十年前,我玩过随机声音。 我需要几个混乱的来源。
我只是告诉你那些我保留并发现有用的东西。当然因为他们需要种子,所以他们是伪乱。
1 /对于-1和1之间的混沌浮点数:计算函数f(x)= cos(exp(x))。 exp()增长得如此之快,以至于经过很少的迭代后,cos()的结果就是混乱。
2 /贝克变换:0到1之间的混沌数:取一个数,乘以2,再次,当它高于1时,减去一些东西,使其回到0和1之间。更多准确的解释The Baker Transform。
但我认为rand()和srand()会让你满意。
对于适用于10-20的范围,当然可以通过乘法和偏移来拉伸/缩放混沌范围(0; 1)或(-1; 1),以便输出符合您的需要。 ; - )
答案 4 :(得分:2)
使用模数(%
)的方法不是一个好选择,因为分布是关闭的。这样更好:
double GetRandom(double Min, double Max)
{
return ((double(rand()) / double(RAND_MAX)) * (Max - Min)) + Min;
}
您需要包含algorithm
并使用srand
播种生成器。
当然,它只是伪随机的。您将无法获得真正随机的结果,尤其是使用rand
。
答案 5 :(得分:1)
使用srand()初始化随机数生成器:
sand(time(NULL));
http://www.cplusplus.com/reference/clibrary/cstdlib/srand/
然后使用rand()
函数生成一系列随机数。
答案 6 :(得分:1)
“生成”真正随机数的唯一方法是通过与一些随机的环境因素的相互作用。本网站提供的服务可以帮助您:http://www.random.org/
答案 7 :(得分:0)
此链接必须帮助您在C ++中生成限制内的随机数 http://www.codeguru.com/forum/showthread.php?t=378879
答案 8 :(得分:0)
看看这个,它可能会有所帮助:
// 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