【问题标题】:Generating a random sequence with no repeats生成没有重复的随机序列
【发布时间】:2012-12-05 07:18:52
【问题描述】:

我在这里阅读了几篇关于生成不重复的随机序列的帖子(例如Create Random Number Sequence with No Repeats),并决定根据自己的需要实现它

实际上,它是一种算法,它对当前计数器的位应用一些非破坏性(可逆)操作,以获得应该只出现一次的伪随机数。由于操作是可逆的,不同的源编号会给出不同的结果编号。

至少有几种可能的操作,例如交换两位,反转一位,循环移位。如果我们只使用提到的那些,那么序列的质量不会很好,因为附近的计数器会产生具有相似数量的 0 和 1 的结果。真正的游戏规则改变者一点一点地异或。现在序列看起来好多了,但问题是:

  • 是否存在足够小的操作子集(例如,将位反转 + 异或位一位)并且添加任何其他操作只会使算法更难阅读,同时不会带来额外的好处
  • 我怎样才能大致猜测给定范围内的操作数,以使序列足够好。例如,对 0 到 31 的数字进行 200 次运算会产生良好的视觉效果,但 0..199 范围内的 200 次运算有时会产生接近的数字块。
  • 是否有用于测试此类序列的算法或测试套件。我知道并曾经使用过可以测试一般随机序列的套件,但这个套件是不同的,因此可能需要一些特殊套件,或者至少需要一些转换回一般随机世界

更新:正如我在此处的评论中发布的,已经有一个像这样的生成器:AES 加密,但不幸的是它只能用于 128 位范围。

谢谢

最大

【问题讨论】:

    标签: algorithm random sequence


    【解决方案1】:

    问题:

    生成一个介于 1 和 N 之间的唯一随机整数列表。

    解决方案:

    1. 生成N个随机数;高斯或均匀...
    2. 对它们进行排序;保存索引(即列表中每个值的位置)
    3. 排序的索引是您的列表。

    在 Matlab 中:

    z = rand( [N 1] );
    [dummy iz] = sort(z);
    

    % iz 是你的列表。

    【讨论】:

    • 这真是天才。
    【解决方案2】:

    除非您有充分的理由,否则您不想重新发明伪随机生成。很可能会出错。我建议从 A[i]=i

    的数组开始

    然后这样做:

    for (i=0; i< n; i++) {
      j = random_number_between(i,n-1);
      swap(A[i],A[j]);
    }
    

    编辑 这是对以下 cmets 的回应:

    您希望序列有多随机。请注意,随机选择的排列中的固有信息是 log(n!),它接近 n/e 位。所以你确实需要生成那么多随机位。现在,由于您希望将这些随机位存储在我认为的任何地方(更像是直觉而不是数学证明),因此如果没有那么多存储空间,将很难进行真正的随机排列)。

    但是,如果您只是想要一个不容易逆向工程的序列,您可以一个接一个地连接多个 1:1 函数。 想到两件事: - 为从 0 到 N-1 的序列保留一个计数器 i。

    • 在 i 上执行 log_2(N/2) 位翻转,在开始序列时随机选择要翻转的位。

    • 使用上述方法在序列开头的 log_2(N) 位上生成随机排列,然后交换上述结果中的位。

    • 找到一个随机数 r1,它是 n at 的相对质数和另一个介于 0 和 n-1 之间的随机数 r2。你的第 i 个数字是 = r2^r % n。

    这些的一些组合应该会给你一个难以逆向工程的序列。关键是你注入的随机位越多,逆向工程就越难。

    想到的一件事是,如果你的范围是 0..N-1,只需找到一个与 N 互质的大数 P,然后选择另一个随机数

    【讨论】:

    • 也许它不是最好的 [需要引用;P] 算法,但您应该寻找类似的算法(比如洗牌)。
    • 你能定义“不是最好的”吗?我认为这个解决方案具有以均匀概率选择任意排列的特性。可能有更快的解决方案,或者可能有使用更少随机位的解决方案,但我对此表示怀疑。
    • 谢谢,但实际上我想实现一些可以用于任何范围的东西,即使是那些可能需要大量空间来使用数组方法的东西。实际上,AES 加密就是这样一种生成器,它将唯一输入与非重复输出联系起来,但仅限于 128 位范围,我只是想要一些类似的算法,但适用于任何位范围。
    猜你喜欢
    • 2017-02-01
    • 1970-01-01
    • 2021-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多