ensemencement arc4random () dans iOS
-
27-09-2019 - |
Question
D'après ce que je peux rassembler arc4random()
génère beaucoup mieux nombres aléatoires que rand()
commet, mais je ne l'ai pas vu un moyen de semences, et Je voudrais tout comme l'utilisation srand()
. Est-il possible?
La solution
Ce n'est pas ce que arc4random est conçu pour faire. Comme l'indique la documentation:
La fonction
arc4random()
fournit un pseudo-aléatoire de haute qualité 32 bits nombre très rapidement. graines dearc4random()
se base sur une base régulière de le noyau fort sous-système de nombres aléatoires décrit dansrandom(4)
.
Comme il est re-graines se provenant d'une source d'entropie de toute façon, vous ne gagnez rien en ensemençant manuellement, et en fait, une telle méthode n'existe pas.
Autres conseils
Vous pouvez réellement faire dans iOS 9.
import GameKit
let source = GKARC4RandomSource(seed: "hello world".data(using: .utf8)!)
source.dropValues(1024)
source.nextInt() // <-- your number
Selon les docs:
Arc4 à base de sources aléatoires ont des séquences initiales reproductibles. Si elle est utilisée pour l'obscurcissement que vous devez supprimer les valeurs N dès le départ, où N doit être un nombre plus grand que 768 pour assurer la séquence initiale est rincée.
Donc, tant que vous utilisez les mêmes données de semences (évidemment sans utiliser !
dans le code de production) et le même nombre de valeurs a diminué, vous obtiendrez les mêmes résultats.
Swift 3 J'utilise srand48()
et drand48()
quand j'ai besoin d'une valeur tête de série. J'ai fait cette fonction qui semble fonctionner assez bien pour mes besoins:
func seeded_rand(seed:Int, min:Double, max:Double) -> Int
{
srand48(seed)
return Int(round(drand48() * (max-min)) + min)
}
Vous pouvez ajouter une séquence d'octets comme aléatoire à arc4random en utilisant: arc4random_addrandom()
Vous n'avez pas besoin réellement de semences ... il se graines sur le premier appel. Consultez la documentation en appelant
man arc4random
dans votre shell. La ligne correspondante, sous DESCRIPTION, est:
There is no need to call arc4random_stir() before using arc4random(),
since arc4random() automatically initializes itself.