我正在尝试制作一个词扰乱器,我想知道是否有任何算法我应该使用或者我是否应该从头开始构建它。任何指针都会有所帮助!
答案 0 :(得分:4)
用于查找元素序列(或者,在您的情况下,单词中的字母)的随机排列的标准算法是 Fisher-Yates shuffle ,它在线性时间内产生真正的随机排列一系列元素。该算法已经很好地建立,并且许多标准库提供了它的实现(例如,C ++ std::random_shuffle
算法通常使用此算法实现),因此您可以找到预先编写的实现。如果没有,该算法非常容易实现,这里有一些伪代码:
for each index i = 0 to n - 1, inclusive:
choose a random index j in the range i to n - 1, inclusive.
swap A[i] and A[j]
执行此操作时要小心,在选择随机索引时,不选择0到n-1之间的索引;这会产生不均匀的字母分布(你可以阅读更多关于in this earlier question的信息)。
希望这有帮助!
答案 1 :(得分:1)
使用Knuth Shuffle(AKA the Fisher-Yates Shuffle)。它具有确保集合的每个排列同样可能的期望特征。 Here's a link用于C中的实现(以及其他语言的实现),适用于任意大小的对象。