【问题标题】:C++ | Generating a pseudo number between 10-20C++ |生成10-20之间的伪数
【发布时间】:2011-05-23 17:26:15
【问题描述】:

我正在制作一个基于文本的 C++ 角色扮演游戏,并试图弄清楚如何计算出敌人对你造成的伤害量。我的想法是这样的。

造成的伤害 = randomIntBetween10and20*enemyLevel

这样,它并不总是每次都命中一定的数量,并且允许有暴击(例如,如果命中高于 15,我会将其归类为暴击)

我是 C++ 新手,所以我不太确定如何做到这一点,任何帮助将不胜感激。

【问题讨论】:

  • 你的问题是随机数的生成吗?看看这里:stackoverflow.com/questions/3786389/…
  • 我第一次将 RPG 读作火箭推进榴弹是不是很糟糕?
  • @Billy ONeal,一点也不差……它是基于文本的。至少战斗人员会遭受严重的 ASCII 伤害。
  • 你真的是认真的吗?如果是这样,您必须对 C++ 有很多经验。使用麦克风噪音可能是有利可图的 :)
  • 有人请编辑问题的标题。正如很多人指出的那样,这个问题与真随机数生成器 (TRNG) 无关。

标签: c++ random


【解决方案1】:

使用 srand() 初始化随机数生成器:

srand(time(NULL));

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

然后使用rand()函数生成随机数序列。

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

【讨论】:

  • @Noah Roberts:那么,对于 RPG,我们是否需要使用加密安全的 RNG? <_>
  • @Noah:同意,但不应该用刀而不是 5 级战斧来攻击它吗?
  • 添加 srand() 以获得 +1。不是或沙子()。 srand() 和 rand() 需要一起使用。
  • 感谢您的帮助马丁。谢谢!周末愉快。
【解决方案2】:

std::random 是一个不错的选择,它是 C++ 内置的随机数生成器。

如果您还没有 C++11 支持,请使用 boost::random。新的std::random 是基于boost::random,所以基本上是一样的。该文档有几个示例,包括Generating integers in a range

提供的选项之一是 Mersenne Twister (mt19937),它是一个很好的通用伪随机数生成器。

与大多数其他建议一样,这是伪随机的。获得真正的随机性更加困难——但对于 RPG 来说,你不需要它,对吧? (对于加密性强的随机数,请考虑 OpenSSL 或在 Windows 上,CryptoAPI。)

【讨论】:

  • 好吧,我不会将 C++0x 称为“最新版本”,因为它还不是 C++。
  • 嗯,很接近了。 “即将发布的版本”怎么样?我在 MSVC 中一直使用std::random,我知道gcc 4.5 也支持它。
【解决方案3】:

看看这个,它可能会有所帮助:

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

【讨论】:

    【解决方案4】:

    使用模数 (%) 的方法不是一个好的选择,因为分布已关闭。这样更好:

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

    您需要包含algorithm 并使用srand 为生成器播种。

    当然,这只是伪随机的。您将无法获得真正随机的结果,尤其是使用 rand

    【讨论】:

    • 这看起来很严重。还是只有我?我喜欢你要去的地方,但你还没到那里。
    • @GregS 有什么问题?我愿意修复它,但我不确定问题出在哪里。
    【解决方案5】:

    你应该从标题中省略“真正”这个词,因为你可能不是这个意思。您可能只需要一个 伪随机 数字。使用个人计算机几乎不可能实现真正的随机性。以下 sn-p 将为您提供 10..19 范围内的伪随机数:

    #include<cstdlib>
    #include<ctime>
    
    // ...
    srand(time(0));
    int r = rand() % (20 - 10) + 10;
    

    如果您想在该范围内包含 20,那么这是 11 个数字的范围:

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

    【讨论】:

    • 其实,这正是我所需要的。非常感谢!
    • 至少这一点提到了区别。 +1
    • 相当多的 PC 实际上具有基于热噪声的随机输入流,其中包括真正的随机性。见en.wikipedia.org/wiki/Hardware_random_number_generator
    • 别忘了。仅在应用程序中调用 srand() 一次
    • 我对这个 sn-p 只有一个问题:恐怕它有偏见。如果我们假设rand() 是无偏的(一开始),那么rand() % N 产生0 的可能性比产生N-1 的可能性略高,除非N-1rand 的最大值的除数可能会产生(或类似的东西:p)。如果N 很小,则不会那么明显(例如1,000,0001 0 代表1,000,000 10,几乎是无偏见的),但是随着N 的增长,这个问题变得越来越重要。我不知道有什么方法可以在 O(1) 时间内在 0..N 中获得均匀分布。
    【解决方案6】:

    正如其他人所说,也许 rand() 对你来说真的足够了。 重要的是用于初始化伪随机数生成器的种子(对 srand() 的调用就是种子)

    但请注意,True Chaos 并不意味着您有完全相同的机会生成任何可能的随机输出。

    十年前,我玩过随机声音生成。 我需要几个混乱源。

    我只是让你知道那些我保留并发现有用的东西。当然,因为他们需要种子,所以他们是伪混沌。

    1/对于介于 -1 和 1 之间的混沌浮点数:计算函数 f(x) = cos(exp(x))。 exp() 增长得如此之快,以至于经过很少的迭代,从 cos() 出来的东西都是混乱的。

    2/baker 变换:0 和 1 之间的混沌数:取一个数,将其乘以 2,然后再次,当它优于 1 时,减去一些东西,使其回到 0 和 1 之间。精确解释The Baker Transform.

    但我认为 rand() 和 srand() 会满足你的。

    为了应用到您的范围 10-20,您当然可以通过乘法和偏移来拉伸/缩放混沌范围 (0;1) 或 (-1;1),以使输出符合您的需要。 ;-)

    【讨论】:

      【解决方案7】:

      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。 Game Coding Complete 有一个相当不错的入门指南。

      【讨论】:

      • 请注意,srand 应该被称为 ONCE 并且永远不会再被调用! (不是每次)
      • @Noah:没有 RNG 是真正“真正”随机的。所有这些都只是伪随机的。对于他的要求,这些选项中的任何一个都是“足够随机的”。
      • @Billy:讨厌打破它,但你是不正确的。到目前为止,我们只发现了 1 个已知的真随机数生成器“算法”(我在那里非常松散地使用了这个术语)。其他所有软件解决方案在不同程度上都是伪随机的。仅仅因为伪随机数生成器比另一个更好,并不能使它真正随机:en.wikipedia.org/wiki/…
      • @Zac:random.org 网站不是软件解决方案。
      • @Billy:无法计算真正的随机性。因此,除非标准 PC 有办法测量我不知道的一些物理现象(以获得所需的熵),否则 /dev/random 必须计算一个随机数,因此它是一个 PRNG,因此不是真正的随机数。
      【解决方案8】:

      “生成”真正随机数的唯一方法是通过与某些随机环境因素的相互作用。本网站为您提供服务:http://www.random.org/

      【讨论】:

      • 很高兴看到人们理解真随机数和伪随机数之间的区别:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-03-25
      • 2011-08-10
      • 1970-01-01
      • 2017-03-12
      • 2013-07-24
      • 1970-01-01
      相关资源
      最近更新 更多