代码之家  ›  专栏  ›  技术社区  ›  Anthony Atmaram

创建一个不那么随机的数字生成器有多困难?[关闭]

  •  1
  • Anthony Atmaram  · 技术社区  · 14 年前

    幕后故事:

    所以我今天晚上开车去乐队练习。我的车有一个USB接口,在那里你可以插入一个带有MP3文件的USB记忆棒,立体声系统会播放它们。我的杆上大约有100英里/小时,所以我按下了“随机”按钮。从这里到乐队练习,它演奏了:

    • 轨道22
    • 轨道45
    • 轨道4
    • 轨道11
    • 轨道87
    • 轨道66
    • 轨道98

    然后在回家的路上

    • 轨道16
    • 轨道27
    • 轨道33

    然后我在加油站停了下来。我加满油,回到车里,音响又响了。它播放

    • 轨道22
    • 轨道45
    • 轨道4
    • 轨道11
    • 轨道87

    我想,wtf?这个“随机”发生器是怎么回事?如果不是时间,他们用什么作为种子?汽车音响的记忆力是不是很强,甚至不能使用c stdlib?有人知道这种事情是怎么发生的吗?

    4 回复  |  直到 14 年前
        1
  •  2
  •   T.J. Crowder    14 年前

    不看音乐播放器的代码很难说。一些想法:

    1. 可能是它创建了一个随机播放列表,然后在开始时再次启动该播放列表。例如,一个随机序列,它随后重复,而不是从它的随机数生成器中独立地产生相同的序列两次。
    2. 或者,当然,它 把时间作为种子,时钟会变得一团糟,有时会读到0或其他什么,从而导致重复的序列。
    3. 或者(带着歉意)观察错误。-)
        2
  •  1
  •   Thibault Falise    14 年前

    当您选择随机选项时,MP3播放器往往会生成随机播放列表,然后播放相同的播放列表。

    唯一的“随机”部分是每次重新设置“随机”选项时播放列表都会发生更改。

    例如,iPod Shuffle MP3播放器具有一个功能,允许您重新播放歌曲以生成新的“随机”播放列表。

        3
  •  1
  •   Tom Gullen    14 年前

    重要的是要记住,如果没有良好的统计分析,我们的心理会导致这样一个事实,即我们发现模式,即使它们不存在(为了所有的意图和目的)。

    例如,如果你的iPod上有10首歌,那么当你在2组中播放所有10首歌时,很有可能在两组中都有相邻的曲目。我们的大脑被连接起来,以发现并注意到这一点。

    如果您描述的模式是正确的,那么是的,它们可能稍微弄乱了代码。也许每次关闭设备电源时,内部系统时间都会重置,因此当您通过按“全部播放”而不是“打开”来打开设备时,则“全部播放”可能以相同的顺序播放相同的曲目。或者也许时间不能作为种子。

    或者,可能(不太可能)是随机的。一个真正的随机序列最终会重复顺序,特别是在这样一个100的小集合中,它不会超出在数据子集中看到重复的可能性范围。

        4
  •  0
  •   aioobe    14 年前

    可能是控制随机化的嵌入式设备没有时钟。也许它使用轨道的数量作为种子或类似的东西。

    如果您没有一些外部的随机种子源,例如时钟的读数,那么当所有的内存重置后,软件将在每次启动时都具有确定性。