所以我认为你想要的是使用尽可能少的内存来产生集合的排列。
首先,它不能不使用内存来完成。对于您的第一个字符串,您需要一个可以产生任何具有相同可能性的字符串的函数。假设该函数称为 nextString()。如果您再次调用 nextString() 而不更改状态中的任何内容,当然它将再次能够生成任何字符串。
所以你需要存储一些东西。问题是,您需要存储什么,需要多少空间?
字符串可以看作数字 0 - X^Y。(aaa=0, aab=1,aac=2...aba=X...) 因此,要尽可能高效地存储单个字符串,您需要 lg(X^Y) 位。假设 X = 16 且 Y = 2。然后你需要 1 个字节的存储空间来唯一地指定一个字符串。
当然,最简单的算法是在生成每个字符串时对其进行标记,这需要 X^Y 位,在我的示例中是 256 位(32 字节)。这就是你说你不想做的事。您可以使用此问题中讨论的 shuffle 算法:Creating a random ordered list from an ordered list(您不需要在通过 shuffle 算法生成字符串时存储字符串,但仍需要标记它们)。
好的,现在的问题是,我们能做得更好吗?我们总共需要存储多少?
好吧,在第一次通话时,我们不需要任何存储空间。在第二次调用时,我们需要知道之前生产的是哪一个。在最后一个调用中,我们只需要知道哪个是最后一个。所以最坏的情况是当我们进行到一半时。当我们进行到一半时,已经生产了 128 根弦,还有 128 根要走。我们需要知道还有哪些需要生产。假设这个过程是真正随机的,任何分裂都是可能的。有(256 种选择 128)种可能性。为了能够存储这些中的任何一个,我们需要 lg(256 选择 128) 位,根据谷歌计算器,它是 251.67。因此,如果你真的很聪明,你可以将信息压缩到比简单算法少 4 位。可能不值得。
如果您只是希望它看起来随机且存储空间很小,请参阅以下问题:寻找一种算法以(伪)随机顺序吐出一系列数字