我需要在特定范围之间生成数字,如果数字不合适,则需要在第1个周期之后生成数字,我需要从范围中删除它。
示例:
我将从范围[1-55]生成随机数。我想要号码 24但是通过随机发生器生成。第一个循环后随机 生成器已生成数字4.在下一个循环中,我想生成 来自相同范围的随机数,但排除了数字4。所以范围是 - [1,54] / {4}。如果在下一个周期中产生数字28,那么范围就会 改为 - [1,54] / {4,28}。循环将重复,直到数字24为止 没有生成。
我需要它用于我的进化算法。如果我使用大范围,通过随机数生成算法生成所需数量需要很长时间。我会很感激任何建议。
答案 0 :(得分:0)
从包含完整范围的数组开始:
int range[55];
std::iota(range, range+55, 1);
从n = 55
开始。
现在,每一步:
i
到0
n-1
range[i]
与range[n-1]
交换。n
如果您选择的索引值为24,那么您就完成了。 24之前选择的值位于数组的右侧,剩余的未选择值位于左侧。
我当然假设您需要了解这些价值观。如果你只需要生成值24
,那么int generate24() { return 24;}
就应该这样做。如果您需要知道的是生成24所需的步数,那么它会在1
到55
的范围内均匀分布,因此您可以使用单个随机数生成伪造它。