Swift – 播种arc4random_uniform?还是另类?

Swift – 播种arc4random_uniform?还是另类?,第1张

概述首先让我说明我要完成的任务: >我需要在一个范围内随机生成一组数字 >我希望这些数字在某种程度上均匀分布 >我需要能够为随机数生成种子,这样,给定种子,结果随机数将始终相同. 在使用drand48(),rand()和arc4random()进行了相当多的实验之后,我目前已经决定使用rand()获取随机数,并使用srand()进行种子设定.这是一个从我正在做的事情简化的小例子: let seed: 首先让我说明我要完成的任务:

>我需要在一个范围内随机生成一组数字
>我希望这些数字在某种程度上均匀分布
>我需要能够为随机数生成种子,这样,给定种子,结果随机数将始终相同.

在使用drand48(),rand()和arc4random()进行了相当多的实验之后,我目前已经决定使用rand()获取随机数,并使用srand()进行种子设定.这是一个从我正在做的事情简化的小例子:

let seed: UInt32 = 10srand(seed)let start = 0let end = 100let randomNumber = Double(rand()) % (end + 1 - start) + start

这有效.给定相同的种子,出现相同的随机数.执行多个randomNumber计算会产生多个不同的随机数.通过srand重新播种再次启动“随机性”.

唯一的缺点是rand()不是均匀分布的.事实上,我总是最终得到一组数字,这些数字在大多数情况下线性增加.

听起来像arc4random_uniform会产生更多的均匀随机输出,但是根据我的研究,不可能为arc4random播种,因为它在第一次调用时会自行播种,并且不一定“设计”为外部播种.

所以我的问题;是否有一个更好的srand()/ rand()替代方案仍然可以为给定的种子提供相同的输出,但这些输出更均匀分布?

谢谢,
– 亚当

解决方法 我知道“GameKit”听起来只是为了游戏,但它包含一个严重的随机数生成系统.我建议你看看 GKMersenneTwisterRandomSource和 GKRandomDistribution.GKMersenneTwisterRandomSource采用一个随机种子(如果你这样选择),GKRandomdistribution类实现一个统一分布.一起使用,它们完全符合您的要求.

import GameKit// The Mersenne Twister is a very good algorithm for gene@R_404_5257@ random// numbers,plus you can give it a seed...    let rs = GKMersenneTwisterRandomSource()rs.seed = 1780680306855649768// Use the random source and a lowest and highest value to create a // GKRandomdistribution object that will provIDe the random numbers.   let rd = GKRandomdistribution(randomSource: rs,lowestValue: 0,highestValue: 100)// Now generate 10 numbers in the range 0...100:    for _ in 1...10 {    print(rd.nextInt())}print("---")// Let's set the seed back to the starting value,and print the same 10// random numbers.    rs.seed = 1780680306855649768for _ in 1...10 {    print(rd.nextInt())}
总结

以上是内存溢出为你收集整理的Swift – 播种arc4random_uniform?还是另类?全部内容,希望文章能够帮你解决Swift – 播种arc4random_uniform?还是另类?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1013954.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存