0

我需要在特定范围之间生成数字,如果数字不适合,则在第一个周期之后,我需要将其从范围中删除。

例子:

我将从 [1-55] 范围内生成随机数。我想要数字 24,但通过随机生成器生成。在第一个周期随机生成器生成数字 4 之后。在下一个周期中,我想从相同范围内生成随机数,但不包括数字 4。所以范围是 - [1,54] / {4}。如果在下一个周期中生成了 28 号,则范围将更改为 - [1,54] /{4,28}。循环将重复,直到没有生成数字 24。

我的进化算法需要它。如果我使用大范围,通过随机数生成算法生成所需的数字需要很长时间。我将不胜感激任何建议。

4

1 回答 1

0

从包含完整范围的数组开始:

int range[55];
std::iota(range, range+55, 1);

开始n = 55

现在,在每一步:

  • i0to 中选择一个随机数n-1
  • range[i]与交换range[n-1]
  • 递减n

如果您选择的索引处的值为 24,那么您就完成了。在 24 之前选择的值位于数组的右侧,其余未选择的值位于左侧。

我当然假设您需要知道这些值。如果您只需要生成值,24那么int generate24() { return 24;}应该这样做。如果您只需要知道生成 24 需要多少步,那么它会均匀分布在 to 的范围内155因此您可以通过生成单个随机数来伪造它。

于 2013-03-07T22:36:39.283 回答