在下面的Ruby代码中,我有两种方法d100_in_detect
和d100_out_detect
,它们根据Array
的结果返回ary
中包含的唯一元素的d100
(为简单起见,使用数字)。
def d100
1 + ( rand 100 )
end
def d100_in_detect( ary )
choice = [ ]
100.times do
choice.push ary.detect { |el| d100 <= el }
end
choice.uniq.sort
end
def d100_out_detect( ary )
choice = [ ]
numbers = [ ]
100.times do
numbers.push d100
end
numbers.each do |i|
choice.push ary.detect { |el| i <= el }
end
choice.uniq.sort
end
如您所见,这两种方法之间的区别在于,第一个
d100
在detect
的块内被调用,而第二个100个随机数被存储在numbers
Array中,然后在d100_in_detect
中被使用。假设我按如下方式调用这两种方法
ary = [ ]
50.times do |i|
ary.push i * 5
end
puts '# IN DETECT #'
print d100_in_detect ary
puts
puts '# OUT DETECT #'
puts d100_out_detect ary
puts
典型输出如下。
# IN DETECT #
[ 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55 ]
# OUT DETECT #
[ 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100 ]
我不知道为什么这两种方法返回如此不同的结果。
在
d100
的块中调用detect
方法有什么含义吗? 最佳答案
正确的。
我要做的第一件事是修改示例脚本:
def d100_in_detect( ary )
choice = [ ]
numbers = []
100.times do
var = d100
numbers << var
choice.push ary.detect { |el| var <= el }
end
puts numbers.inspect
choice.uniq.sort
end
def d100_out_detect( ary )
choice = [ ]
numbers = [ ]
100.times do
numbers.push d100
end
puts numbers.inspect
numbers.each do |i|
choice.push ary.detect { |el| i <= el }
end
choice.uniq.sort
end
如您所见,我所做的只是将d100的结果分配给一个临时变量,以查看发生了什么...。然后,“错误”消失了!我的返回值突然相同。唔。
然后,这正是发生在我身上的事情。当您“缓存”变量时(如第二个示例中所做的那样),您保证可以分散100个数字。
当您遍历该块时,对于该块中的每个数字,您将再次执行d100。因此,第一个调用比第二个调用要多得多...但是您还需要在该调用被调用时随机生成的数字要大于该数字(而如果您随机生成2个为100的数字,则可以保证它会在某个时候达到100)。这会使您的脚本偏向于较低的数字!
例如,运行:
@called_count = 0
def d100
@called_count += 1
1 + ( rand 100 )
end
def d100_in_detect( ary )
choice = [ ]
numbers = []
100.times do
choice.push ary.detect { |el| d100 <= el }
end
puts @called_count.inspect
@called_count = 0
choice.uniq.sort
end
def d100_out_detect( ary )
choice = [ ]
numbers = [ ]
100.times do
numbers.push d100
end
puts @called_count.inspect
@called_count = 0
numbers.each do |i|
choice.push ary.detect { |el| i <= el }
end
choice.uniq.sort
end
我懂了
# IN DETECT #
691
# OUT DETECT #
100
关于Ruby#使用随机数检测行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14628731/