【问题标题】:Sample an array with seed value to get consistent result使用种子值对数组进行采样以获得一致的结果
【发布时间】:2020-10-05 19:18:22
【问题描述】:

我正在对几个数组进行采样,并希望添加一个种子值,以便在现在和将来每次运行时都获得一致的结果。

我的例子:

constant_seed_value = 123456789
["a","b","c"].sample(seed: constant_seed_value ) should return "a" when run every time.

【问题讨论】:

    标签: ruby ruby-on-rails-6


    【解决方案1】:

    只需将带有种子的Random.new 传递给sample

    %w[a b c].sample(1, random: Random.new(123456789))
    #=> ["a"]
    

    Array#sampleRandom

    【讨论】:

    • 打败我。但我会在你的答案中添加一些文档参考。
    • 我注意到,如果我在运行[].sample 之前运行srand 1,它总是返回相同的值。这也是一种可行的方法吗,所以我不需要每次都传递值?
    • 这样好吗?取决于您实际尝试实现的目标。您从未告诉我们为什么您希望基于随机的方法sample 不返回随机值。是要测试一个会返回随机值的方法吗?
    【解决方案2】:

    您需要将种子设为常量(或将其写入文件并在每次程序运行时读取)。我假设你不在乎种子到底是什么。

    如果边计算产生

    Random.new_seed
      #=> 44220669194288225494276674522501875094 
    

    你会写

    SEED = 44220669194288225494276674522501875094
    

    Random::new_seed

    程序运行时,您必须将种子初始化为该值。

    Random.srand(SEED)
      #=> 129123040985656142450143558000073927364
    

    Random::srand

    现在让我们计算一些伪随机值。

    arr = (1..1000).to_a
    
    arr.sample(4)
      #=> [762, 619, 41, 997] 
    rand
      #=> 0.9619996498741139 
    rand
      #=> 0.7952214967836931 
    

    现在恢复初始种子,就像我们重新运行程序一样。

    Random.srand(SEED)
      #=> 190782386885144604306184636344084340916 
    

    如果我们重复伪随机值的初始构造,我们会发现它们与我们第一次计算它们时相同。

    arr.to_a.sample(4)
      #=> [762, 619, 41, 997]
    rand
      #=> 0.9619996498741139 
    rand
      #=> 0.7952214967836931 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-17
      • 2011-12-19
      • 2012-07-31
      • 2023-04-09
      • 2012-03-10
      • 2014-07-03
      相关资源
      最近更新 更多