gpt4 book ai didi

ruby - Array#sample 随机数生成器

转载 作者:数据小太阳 更新时间:2023-10-29 07:28:33 27 4
gpt4 key购买 nike

如果您传递一个范围作为随机数生成器,Array#sample 是如何工作的?如这里:

> [*1..10].sample(random: 1..3)
=>9

最佳答案

根据文档, sample(random: rng) , rng不是 Range对象,如你所想。 rng是一个随机数生成器。

The optional rng argument will be used as the random number generator.

a = (1..10).to_a
r = Random.new
r2 = r.dup
a1 = a.sample(random: r)
a2 = a.sample(random: r2)
a1 == a2 # => true

重点是#sample , 将其第二个参数作为关键字参数。如果我们使用类似 foo: 12 的东西或 rng: (1..2) ,它会给出 ArgumentError: unknown keyword:可选参数 仅当您为其提供值 random: <any random number generator> 时才可接受。 .现在,进入你的观点:

r = 1..3
a1 = [*1..10].sample(random: r)
a2 = [*1..10].sample(random: r)
a1 == a2 # => false

当您将第二个参数作为 random: r 传递时, r必须是 Random 对象,或响应 #rand 对象 .记住 第二个 参数,你是在告诉 #sample , 使用您的随机数生成器而不是它在缺少可选参数时使用的默认

这是 RNG 的一个自定义实现:

ob = Object.new

def ob.to_int
5000
end

gen_to_int = proc do |max|
ob
end

class << gen_to_int
alias rand call
end

ary = (0...10000).to_a

ary.sample(random: gen_to_int) # => 5000
ary.sample(random: gen_to_int) # => 5000
ary.sample(random: gen_to_int) # => 5000

这会让您了解 #sample使用可选 参数。从 #test_sample_random 中查找更多示例.

更新

How does Array#sample work, if you pass a range as random numbers generator?

要回答这个问题,我需要 TracePoint 的帮助类。

trace = TracePoint.new(:c_call) do |tp|
p [tp.lineno, tp.defined_class, tp.method_id, tp.event]
end

trace.enable do
[1,2,3,4,5,66,4].sample(random: 1..3)
end
# >> [6, Array, :sample, :c_call]
# >> [6, Kernel, :rand, :c_call]
# >> [6, Kernel, :respond_to_missing?, :c_call]

因此,从上面的调用堆栈,您可以看到 - Array#sample方法已被调用。现在在内部,Ruby 调用了 Kernel#randRange 上目的。现在,(1..3).respond_to?返回 false (因为 #rand - 它是 Range 的一个_private_ 实例方法),这就是最后 #respond_to_missing? 的原因已调用方法来完成这项工作。

关于ruby - Array#sample 随机数生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28681596/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com