草庐IT

Swift - 播种 arc4random_uniform?还是另类?

coder 2023-09-06 原文

让我首先说明我要完成的任务:

  1. 我需要在一定范围内随机生成一组数字
  2. 我希望这些数字稍微均匀分布
  3. 我需要能够为随机数生成播种,这样,给定一个种子,生成的随机数将始终相同。

在对 drand48()、rand() 和 arc4random() 进行了大量试验后,我目前决定使用 rand() 获取随机数,并使用 srand() 进行播种。这是一个从我正在做的事情中简化而来的小例子:

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

这行得通。给定相同的种子,会产生相同的随机数。执行多个 randomNumber 计算会产生多个不同的随机数。通过 srand 重新播种再次开始“随机性”。

唯一的缺点是 rand() 不是均匀分布的。事实上,我几乎总是以一组在大多数情况下线性增加的数字结束。

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

所以我的问题;有没有比 srand()/rand() 更好的替代方法,它仍然会为给定的种子提供相同的输出,但这些输出分布更均匀?

谢谢, - 亚当

最佳答案

我知道“GameKit”听起来像是只用于游戏,但它包含一个严肃的随机数生成系统。我建议你看看GKMersenneTwisterRandomSourceGKRandomDistribution . GKMersenneTwisterRandomSource 采用随机种子(如果您选择的话),GKRandomDistribution 类实现均匀分布。结合使用,它们可以完全满足您的需求。

import GameKit

// The Mersenne Twister is a very good algorithm for generating 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 = 1780680306855649768
for _ in 1...10 {
    print(rd.nextInt())
}

关于Swift - 播种 arc4random_uniform?还是另类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38679670/

有关Swift - 播种 arc4random_uniform?还是另类?的更多相关文章

  1. ruby-on-rails - 如何播种图像的路径? - 2

    Organization和Image具有一对一的关系。Image有一个名为filename的列,它存储文件的路径。我在Assets管道中包含这样一个文件:app/assets/other/image.jpg。播种时如何包含此文件的路径?我已经在我的种子文件中尝试过:@organization=...@organization.image.create!(filename:File.open('app/assets/other/image.jpg'))#Ialsotried:#@organization.image.create!(filename:'app/assets/other/i

  2. ruby-on-rails - 如何播种 belongs_to 关联? - 2

    我想播种我的产品并将它们分配给特定的用户和商店。Product.rbclassProduct注意:Storebelongs_toBusiness(:business_name)种子.rb这是我的基本设置:user=User.create(:username=>'user',:email=>'user2@email.com')store=Store.create(:business_name=>'store',:address=>'Japan')我尝试了这些,但它们没有用:#ThisgivesrandomID'srangingfrom1to4425!?user.products.crea

  3. ruby-on-rails - 使用 secure_random stub rspec 中的随机值 - 2

    我正在尝试为我的gem编写规范,它生成otp并将其保存在数据库中。现在我正在为它编写规范。所以基本上我有三种方法generate_otp!、regenerate_otp!、verify_otp(otp)。generate_otp!的作用是调用包含三个变量的方法generate_otpotp_code-基本上是使用secure_random生成的随机值otp_verified-一个bool值,用于设置otp是否已验证的状态otp_expiry_time-设置otp的到期时间,可以由Rails应用在配置中设置。这三个也是我的数据库的列。在generate_otp之后,我正在调用active

  4. ruby - Ruby 的 OpenSSL::Random 种子是否足够? - 2

    我对Ruby知之甚少,所以如果这个问题的答案显而易见,请原谅我。我注意到http://www.ruby-doc.org/stdlib-1.9.3/libdoc/securerandom/rdoc/SecureRandom.html当调用random_bytes时,Ruby使用pid和当前时间来播种OpenSSL::Random。除非幕后发生其他事情,否则这不正是Netscape在90年代中期在其最初的SSL实现中使用的种子吗?http://en.wikipedia.org/wiki/Random_number_generator_attack#Prominent_examples_of

  5. ruby-on-rails - rails : each in random order - 2

    这是我的代码:我想随机排列答案对象。考虑到可能的答案数量少于10个,最有效的方法是什么? 最佳答案 您可以使用shuffle像这样的方法:question.answers.shuffle.eachdo|answer| 关于ruby-on-rails-rails:eachinrandomorder,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/13123197/

  6. ruby - 为什么 random 在 Ruby 中这样工作? - 2

    我试图在确定性地随机选择东西方面变得聪明,并发现了这个:irb(main):011:0>Random.new(Random.new(1).rand+1).rand==Random.new(1).rand=>trueirb(main):012:0>Random.new(Random.new(5).rand+1).rand==Random.new(5).rand=>falseirb(main):013:0>Random.new(Random.new(5).rand+5).rand==Random.new(5).rand=>true有那么一瞬间,我想“哇,这可能是随机数生成器的一个属性”,但

  7. ruby-on-rails - 如何使用 Capistrano gem 为生产数据库播种? - 2

    我正在使用RubyonRails3.0.9,我想为生产数据库添加种子以添加一些记录而无需重新构建所有数据库(即是,不删除所有现有记录,而只是添加一些尚不存在的记录)。我想这样做,因为需要新数据才能使应用程序正常工作。因此,由于我使用的是Capistranogem,因此我在控制台中运行cap-T命令以列出所有可用命令并了解如何实现我的目标:$cap-T=>...=>capdeploy:seed#Reloadthedatabasewithseeddata.=>...我不确定“使用种子数据重新加载数据库”中出现的“重新加载”一词。句子。所以,我的问题是:如果我在本地计算机的控制台中运行cap

  8. ruby-on-rails - 在 Rails 中播种数据库的最佳方法是什么? - 2

    我有一个rake任务,它在我的Rails应用程序中填充一些初始数据。例如,国家、州、移动运营商等。我现在设置它的方式是,我在/db/fixtures的文件中有一堆创建语句和一个处理它们的rake任务。例如,我有一个模型是主题。我在/db/fixtures中有一个theme.rb文件,看起来像这样:Theme.delete_allTheme.create(:id=>1,:name=>'Lite',:background_color=>'0xC7FFD5',:title_text_color=>'0x222222',:component_theme_color=>'0x001277',:c

  9. javascript - Algolia 即时搜索.js : how to display the results with a random order? - 2

    我正在使用Algoliainstantsearch.js来显示选举候选人(此处:https://laprimaire.org/candidats/)。我希望候选人的初始显示是随机的,以便每个候选人或多或少获得相同的可见度。我在这个答案中读到,它不是Algolia的一个特性,但它应该可以通过一些js技巧来实现:Isitpossibletosortrandomly,andtoqueryonfieldifitexists?问题是我正在使用instantsearch.js,但我找不到如何在instantsearch.js的情况下实现上述searchFunction。我从文档中看到可以使用sea

  10. Javascript - for 循环中的 Math.random - 2

    刚刚在Javascript中尝试在for循环的条件(这就是所谓的?)中生成随机数时遇到了一些有趣的事情。所以,如果我要编写这样的代码:for(vari=0;i它会返回这样的结果:958332684456335345311但是如果我要在第二个for循环之前在变量中生成一个随机数:for(vari=0;i它会返回这样的结果:11131421919171921851518211916151320这里究竟发生了什么?这让我困惑了一会儿。for循环中的Math.random()是否在每次迭代后生成一个新的随机数?循环是否运行代码、迭代和检查条件,并在每次检查条件时生成一个新的随机数?这就是正在发

随机推荐