Я использовал arc4random() и arc4random_uniform(), и у меня всегда было ощущение, что они не были точно случайными, например, я случайно выбрал значения из массива, но часто значения, которые выходили, были одинаковыми, когда я генерировал их несколько раз подряд, поэтому сегодня я подумал, что буду использовать игровую площадку Xcode, чтобы увидеть, как эти функции ведут себя, поэтому я сначала тестирую arc4random_uniform, чтобы сгенерировать число от 0 до 4, поэтому я использовал этот алгоритм:
import Cocoa
var number = 0
for i in 1...20 {
number = Int(arc4random_uniform(5))
}
И я запускал его несколько раз, и вот как меняются ценности большую часть времени:
Так как вы можете видеть, что значения постоянно увеличиваются и уменьшаются, и как только значения находятся на максимуме/минимуме, они часто остаются на нем в течение определенного времени (см. первый скриншот на 5-м шаге, значение остается на 3 в течение 6 шагов, проблема в том, что это совсем не необычно, функция фактически ведет себя таким образом большую часть времени в моих тестах.
Теперь, если мы посмотрим на arc4random()
, это в основном то же самое:
Итак, вот мои вопросы:
- Почему эта функция ведет себя таким образом?
- Как сделать его более случайным?
Спасибо.
РЕДАКТИРОВАТЬ:
Наконец, я сделал два эксперимента, которые были удивительными, первый с реальной кости:
Что меня удивило, так это то, что я бы не сказал, что это было случайным, так как я видел такой же шаблон, который описывался как неслучайный для arc4random() и arc4random_uniform(), так как Jean-Baptiste Yunès отметил, что людям нехорошо видеть, действительно ли последовательность чисел является случайной.
Я также хотел сделать более "научный" эксперимент, поэтому я сделал этот алгоритм:
import Foundation
var appeared = [0,0,0,0,0,0,0,0,0,0,0]
var numberOfGenerations = 1000
for _ in 1...numberOfGenerations {
let randomNumber = Int(arc4random_uniform(11))
appeared[randomNumber]++
}
for (number,numberOfTimes) in enumerate(appeared) {
println("\(number) appeard \(numberOfTimes) times (\(Double(numberOfGenerations)/Double(numberOfTimes))%)")
}
Чтобы узнать, сколько раз каждый номер появился, и, фактически, цифры генерируются случайным образом, например, вот один вывод с консоли:
0 появилось 99 раз.
1 появилось 97 раз.
2 появилось 78 раз.
3 появилось 80 раз.
4 появилось 87 раз.
5 появилось 107 раз.
6 появилось 86 раз.
7 появилось 97 раз.
8 появилось 100 раз.
9 появилось 91 раз.
10 появилось 78 раз.
Так что это определенно ОК 😊
ИЗМЕНИТЬ № 2: я снова сделал эксперимент с кубиками с большим количеством рулонов, и это все еще так же удивительно для меня: