【问题标题】:Specific random number generator特定的随机数发生器
【发布时间】:2013-03-07 22:28:41
【问题描述】:

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

例子:

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

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

【问题讨论】:

  • 你走了多远?
  • 他的典型起始范围是多少
  • 没有取决于用户输入的典型范围。但是让我在例子中写的范围是一个典型的范围。我刚刚从 [1-54] 范围内生成随机数,但不知道如何继续。如何排除生成的数字?
  • 搜索 Fisher-Yates shuffle 和 Floyd 算法以生成不重复的随机数。

标签: c++ random numbers


【解决方案1】:

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

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

n = 55开头。

现在,在每一步:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-05
    • 2011-01-23
    • 1970-01-01
    • 2019-12-15
    相关资源
    最近更新 更多