Этот код на Java является реализацией перетасовки Кнута, но детерминированной, управляемой семенем для генератора случайных чисел.
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, которое выводит тот же порядок перемешивания при одном и том же начальном числе? Я использую 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;
}
}
В настоящее время два метода перемешивания не дают одинаковых результатов для одних и тех же входных параметров. Я уверен, что я что-то упускаю!