Java中的这段代码是Knuth的shuffle的实现,但它是一个确定性的,可由种子控制到随机数生成器。
public String shuffleString(String data, long shuffleSeed) {
if(shuffleSeed!=0) {
Random rnd = new Random(shuffleSeed);
StringBuilder sb = new StringBuilder(data);
int n = data.length();
while(n>1) {
int k = rnd.nextInt(n--);
char t = sb.charAt(n);
sb.setCharAt(n, sb.charAt(k));
sb.setCharAt(k, t);
}
return sb.toString();
}
else {
return data;
}
}
如何在Objective C中实现确定性shuffle,在给定相同种子的情况下输出相同的shuffle顺序?我正在使用srandom(_shuffleSeed);和random()%(n--)知道arc4_random更好,但不能播种。
- (NSString*) shuffleString:(NSString*) data withShuffleSeed:(int) shuffleSeed {
if(shuffleSeed!=0) {
srandom(_shuffleSeed);
NSMutableString *result = [[NSMutableString alloc] initWithString:data];
unsigned long n = data.length;
while(n>1) {
unsigned long k = random()%(n--);
unichar t = [result characterAtIndex:n];
NSRange r1 = {n,1};
[result replaceCharactersInRange:r1 withString:[NSString stringWithFormat:@"%c", [result characterAtIndex:k]]];
NSRange r2 = {k,1};
[result replaceCharactersInRange:r2 withString:[NSString stringWithFormat:@"%c", t]];
}
return result;
}
else {
return data;
}
}
目前,两个shuffle方法对于相同的输入参数不会产生相同的结果。我相信我错过了什么!
答案 0 :(得分:2)
有许多使用种子的伪随机数生成算法。您不能假设Java标准库中的那个使用与Objective C中的srandom
/ random
完全相同的算法。
Java随机生成器使用:
该类使用48位种子,使用线性修改 同余公式。 (见唐纳德克努特,计算机艺术 编程,第3卷,第3.2.1节。)
它不会再提供任何保证,但由于向后兼容原因,它永远不会改变。
您的选择是: