Java 生成字符串的一个排列

Java 生成字符串的一个排列,java,python,algorithm,math,permutation,Java,Python,Algorithm,Math,Permutation,我正在读这篇文章(第3页和第8页):它定义了一个置换函数来生成签名的置换。签名是一串类似“1001”的位 它将置换函数定义如下: 但是,当我应用它时,它不起作用。假设我有字符串“1001”,它的索引是{0,1,2,3}。其目的是将索引排列为{2,3,0,1}。设p=7,a=1,b=2。现在我需要排列索引,以便: π(0)=(0+2)模7=2 π(1)=(1+2)模7=3 pi(2)=(2+2)mod 7=4您需要的是字符串的随机排列。您可以使用Knuth shuffle,而不是使用本文中指定的

我正在读这篇文章(第3页和第8页):它定义了一个置换函数来生成签名的置换。签名是一串类似“1001”的位

它将置换函数定义如下:

但是,当我应用它时,它不起作用。假设我有字符串“1001”,它的索引是{0,1,2,3}。其目的是将索引排列为{2,3,0,1}。设p=7,a=1,b=2。现在我需要排列索引,以便:

π(0)=(0+2)模7=2

π(1)=(1+2)模7=3


pi(2)=(2+2)mod 7=4您需要的是字符串的随机排列。您可以使用Knuth shuffle,而不是使用本文中指定的方法。随机排列背后的想法是得到一个的概率应该是1/n!。就是这样。您可以使用满足此条件的任何算法


好的,您的代码正在生成0,p范围内的索引。但是您的源数组的长度=源字符串的长度。

给定的函数本质上是一个随机数生成器。要获得置换索引,需要根据数组大小修改结果。因此对于

1001
您将使用
pi(x)%4

编辑: 再想一想,这个函数不太可能是一对一的,因为最终会出现类似于
0 mod 4=4 mod 4
0 mod 7!=4模块7

为了在您的范围内生成元素,您必须反复应用该函数,直到获得范围内的数字。因此,如果您得到
pi(0)=6
请尝试
pi(6)
,如果
pi(6)=5
请尝试
pi(5)


在您发布的代码中,作者似乎总是使用素数数组进行排列,因此他没有这个问题。

因为您没有向我们展示您的代码,任何人都很难提供帮助。@JimGarrison这与代码无关,因为数组超出了索引,因为置换函数生成了错误的值。问题主要在于排列算法,我展示了它是如何计算新索引的。我添加了本文作者的代码,但它是用python编写的。我对python不是很在行,但我看不出它是按数组大小修改的。你能看一看吗?我试过你说的测试文本,但有些索引被排除在结果之外。所以,如果我有“古柯”,我有时会得到“科戈”,你是对的。请看编辑。我没有看到python代码做这些。是的,他没有做这些。如果您通读该库中的所有代码,您将看到他在任何地方都只使用基本大小的数据结构。除了提到函数的那一节外,我没有读过那篇文章,但那一部分似乎是说,在所描述的过程中,必须首先选择任意数量的单位随机向量,因此可能很方便地选择这些向量的素数,并直接使用简单的公式。
class Permutation(object):
    def __init__(self, maximumValue): 
        if not isPrime(maximumValue): raise Exception('Maximum value should be prime')
        self.p, self.a, self.b = maximumValue, random.choice(range(maximumValue)[3::2]), random.choice(range(maximumValue))
    def applyFunction(self, x): return (self.a*x+self.b)%self.p
    def __eq__(self, other): return self.a==other.a and self.b==other.b and self.p==other.p
    def __str__(self): return 'p: %s, a: %s, b: %s'%(self.p, self.a, self.b)