Подтвердить что ты не робот

заполнение arc4random() в iOS

Из того, что я могу почерпнуть, arc4random() генерирует гораздо лучшие случайные числа, чем rand(), однако я не видел способа его заполнить, и я хотел бы просто использовать srand(). Есть ли способ?

4b9b3361

Ответ 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)
}

Ответ 5

На самом деле вам не нужно засевать его... он сажает себя при первом вызове. Проверьте документацию, позвонив

man arc4random

в вашей оболочке. Соответствующая строка в разделе ОПИСАНИЕ:

There is no need to call arc4random_stir() before using arc4random(),
since arc4random() automatically initializes itself.