特定的随机数发生器

时间:2013-03-07 22:28:42

标签: c++ random numbers

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

示例:

  

我将从范围[1-55]生成随机数。我想要号码   24但是通过随机发生器生成。第一个循环后随机   生成器已生成数字4.在下一个循环中,我想生成   来自相同范围的随机数,但排除了数字4。所以范围是 -   [1,54] / {4}。如果在下一个周期中产生数字28,那么范围就会   改为 - [1,54] / {4,28}。循环将重复,直到数字24为止   没有生成。

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

1 个答案:

答案 0 :(得分:0)

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

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

n = 55开始。

现在,每一步:

  • i0
  • 选择一个随机数n-1
  • range[i]range[n-1]交换。
  • 减少n

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

我当然假设您需要了解这些价值观。如果你只需要生成值24,那么int generate24() { return 24;}就应该这样做。如果您需要知道的是生成24所需的步数,那么它会在155的范围内均匀分布,因此您可以使用单个随机数生成伪造它。