【问题标题】:Random RPG Stat Generation随机 RPG 统计生成
【发布时间】:2025-12-03 23:15:01
【问题描述】:

我正在做一个个人项目,为 D&D 等桌面 RPG 开发一个统计生成器。我需要生成的数字满足以下条件:

  • 数字必须在 1 和 d(骰子的大小)之间。
  • n 个随机数之和必须始终为 (d+1)n\2

例如,如果 d = 20n = 6,总和应该是 S = 63,随机数应该是在 1 到 20 之间。这意味着平均输出类似于 [10, 11, 10, 11, 10, 11]

in this post 涵盖了生成具有恒定总和的数字的问题,并且我对生成一定范围内的数字非常熟悉,但我想知道是否有一个简单的算法可以确保这两个标准都是遇到了。

【问题讨论】:

  • 可能是骗子:*.com/questions/288739/…
  • 我相信您正在寻找这个? *.com/a/19728404/845092
  • 能否请您添加一个示例,说明您正在尝试做的事情以及实际得到的结果?
  • 你知道统计上 d n 面骰子掷出的总和的平均值是 d*(n+1)/2,而不是 d*n/2?我问是因为我怀疑您的总和条件与此有关。
  • @Thebluefish 我会尝试的。你会发布这个作为答案吗?

标签: c++ random


【解决方案1】:

我将提供伪代码,由于工作职责从C++切换到JS,我很生疏。

这里的想法是我们在每个统计数据中随机分配各个点。

d = 20;
n = 6;
stats = [1, 1, 1, 1, 1, 1];

sum = (d+1)n\2 - n;

int i = 0;
while(i < sum)
{
    // Assuming rand(0,5) produces integer values in range [0..5]
    r = rand(0,5);
    if(stats[r] < 20)
    {
        stats[r]++;
        i++;
    }
}

【讨论】:

  • 请张贴作为答案,实际的实现肯定更好。
  • @Bob__ 你的代码是错误的,我相信 - 它调用了两次分发来获得一个位置。你检查一次位置,如果它低于它就增加它
  • 这个答案不考虑第一个约束。 @SeverinPappadeux 的代码似乎更正确。请张贴作为答案!或者 Thebluefish 更新您的答案以包含测试。
  • @CrisLuengo 不错。我已经相应地更新了我的伪代码。我仍然相信实际可用代码的作者应该写一个正确的答案。
  • 我实际上想出了一个代码示例(这就是这个问题的意义所在)。链接是ideone.com/w1GQgc。需要反馈。