2016-12-25 4 views
4

мне нужно сгенерировать случайное число, соответствующее каждому значению в индексе, где он должен быть воспроизводимым для каждого значения индекса, независимо от того, сколько индексов приведены:Воспроизводимые Случайные значения в вектор произвольной длины

Как например, я мог бы предоставить индексы от 1 до 10, а затем в другое время, вызвать индексы от 5 до 10, и оба они должны быть одинаковыми для значений с 5 по 10. Установка глобального семени не будет делать этого , он будет сохраняться только для n-го элемента в случайном вызове по положению в векторе.

То, что я до сих пор это, который работает по желанию:

f = function(ix,min=0,max=1,seed=1){ 
    sapply(ix,function(x){ 
    set.seed(seed + x) 
    runif(1,min,max) 
    }) 
} 
identical(f(1:10)[5:10],f(5:10)) #TRUE 
identical(f(1:5),f(5:1)) #FALSE 
identical(f(1:5),rev(f(5:1))) #TRUE 

мне было интересно, если есть более эффективный способ достижения выше, без установки семени явно для каждого индекса, как компенсировать глобальное семя.

ответ

0

Используйте шифрование. Благодаря заданному ключу уникальные входы всегда будут выдавать уникальные выходы. Пока введенные вами цифры отличаются друг от друга, выходы всегда будут разными; одни и те же номера будут всегда шифроваться на выходе cyphertext. Используйте DES для 64-разрядных номеров или AES для 128-битных номеров. Для других размеров сверните свой собственный шифр Файстеля (небезопасный, но случайный) или используйте шифр Haste Pudding.

+0

Можете привести пример? –

+0

Пример чего? Шифрование вообще? DES? AES? Общий [шифр Файстеля] (https://en.wikipedia.org/wiki/Feistel_cipher)? [Haste Pudding cipher] (https://en.wikipedia.org/wiki/Hasty_Pudding_cipher)? – rossum

+0

Пример использования этого для решения моего актуального вопроса. –

Смежные вопросы