在给定范围内总和的随机数数组?

Moe*_*der 7 c random algorithm

在C中,如何获得n个数组(在我的情况下每个0x00-0xFF),其中总和在给定范围内0..k

几乎复制C++多个随机数加起来等于一定数量针对特定款项,但对我来说总和可之间的任何东西0..k.

Bla*_*laf 4

您需要指定所需的随机数分布。

如果没有进一步的要求,我会建议以下之一:


(1)

  • 在区间0 .. k中选择随机数a[1]
  • 在区间0 .. ka[1 ] 中选择随机数a[2]
  • 在区间0 .. ka[1]-a[2]中选择随机数a[3]
  • ...
  • 在区间0 .. ka[1]-a[2]-...-a[n-1] 中选择随机数a[n]

如果随机数范围有上限m ,请使用min(ka[1]-... m)作为间隔的上限。

缺点:你会得到很多小数字,而只有几个大数字。


(2)

  • 在区间0 .. m中选取n 个随机数a[1], .., a[n] m为上限
  • s = a[1]+a[2]+...+a[n]
  • 将每个a[i]乘以k/s(如果需要整数,则向下舍入)

缺点:这种方式不太可能获得大量数据。如果需要整数,则由于舍入误差,数字之和与k之间可能存在差距。


我认为使用选项(2)你会得到“更好”的数字,但如上所述,这取决于要求。