Из того, что я могу почерпнуть, arc4random()
генерирует гораздо лучшие случайные числа, чем rand()
, однако я не видел способа его заполнить, и я хотел бы просто использовать srand()
. Есть ли способ?
заполнение arc4random() в iOS
Ответ 1
Это не то, что предназначено для arc4random. Как указано в документации:
Функция
arc4random()
обеспечивает высококачественное 32-битное псевдослучайное число очень быстро.arc4random()
семена на регулярной основе из сильная подсистема случайных чисел ядра, описанная вrandom(4)
.
Так как он все-таки повторно семена из энтропийного источника, вы ничего не получаете, высевая его вручную, и на самом деле такой метод не существует.
Ответ 2
Фактически вы можете сделать это в iOS 9.
import GameKit
let source = GKARC4RandomSource(seed: "hello world".data(using: .utf8)!)
source.dropValues(1024)
source.nextInt() // <-- your number
Согласно документам:
Случайные источники на основе Arc4 имеют повторяющиеся начальные последовательности. Если используется для обфускации, вы должны отбросить значения N с начала, где N должно быть любым числом больше 768, чтобы обеспечить очистку начальной последовательности.
Итак, пока вы используете одни и те же данные семени (очевидно, без использования !
в производственном коде) и столько же значений сброса, вы получите те же результаты.
Ответ 3
В Swift 3 я использую srand48()
и drand48()
, когда мне нужно сеянное значение. Я сделал эту функцию, которая, кажется, работает достаточно хорошо для моих нужд:
func seeded_rand(seed:Int, min:Double, max:Double) -> Int
{
srand48(seed)
return Int(round(drand48() * (max-min)) + min)
}
Ответ 4
Вы можете добавить последовательность байтов как случайность к arc4random, используя: arc4random_addrandom()
Ответ 5
На самом деле вам не нужно засевать его... он сажает себя при первом вызове. Проверьте документацию, позвонив
man arc4random
в вашей оболочке. Соответствующая строка в разделе ОПИСАНИЕ:
There is no need to call arc4random_stir() before using arc4random(),
since arc4random() automatically initializes itself.