【问题标题】:How can I randomize a sequence of characters?如何随机化一个字符序列?
【发布时间】:2011-03-08 12:03:07
【问题描述】:

我想编写一个函数来随机化一系列字母字符的顺序。比如序列:

A B C D E F G . . .

...可能会改为:

Z L T A P ...

...如果再次传递给相同的函数可能会导致:

H R E I C ....

有什么建议吗?

【问题讨论】:

标签: c random sequence shuffle


【解决方案1】:

这听起来像是家庭作业,但不管怎样:

http://stanford.edu/~blp/writings/clc/shuffle.html

【讨论】:

  • 我一直想知道只做 n 次,其中 n 是数组的大小,只是看起来不够随机。
  • 是的,这个特定的算法对于小型数组可能不是最好的。但是,人类对“随机”的定义与宇宙明显不同,所以 YMMV :) (我试图找到一篇我最近读过的关于这个主题的文章,但到目前为止无济于事。)
  • 你的文本不是最好的方法,因为算法依赖于 random() 函数
  • @gcc:您已经接受了 Fisher-Yates 算法的答案。它以什么方式不依赖于 random() 函数?
【解决方案2】:

你的意思是随机化字母表?几天前我在PHP中写了类似的东西。逻辑如下:

  1. 令 S1 为包含字母字符“ABC...XYZ”的字符串。
  2. 让 S2 为空字符串。
  3. 当 strlen(S1) > 0 时,从 S1 中选择一个随机字符 C。将 C 附加到 S2 并从 S1 中删除 C。
  4. 返回 S2。

结果是一组随机打乱的字符,以最小的 CPU 负载创建(如果字符串有 26 个字符,则内部循环只需要 26 次迭代)。

【讨论】:

  • 你的算法可能会失败,因为在某个时刻,函数会发送相同的字母给你,你怎么理解旧的没有改变
  • 抱歉这么晚才回复。它输出不变字符串的机会是 1:403,291,461,126,605,635,584,000,000。我什至不知道这么大的数字是怎么称呼的。您可以放心地假设,即使您的计算机以每秒 10 亿次的速度不断生成此字符串的新随机排列,您也不会在 CPU 的整个生命周期中遇到重复。按照这个速度,假设排列永远不会重复,计算机仍然需要连续运行 12,779,535,234 年(如果我的代数没有关闭)以耗尽可能性。
【解决方案3】:

看看Fisher-Yates shuffle算法,尤其是它的modern version

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多