我想创建一个生成2个随机数(num1,num2)的小方法(假设从1到100),但这些数字需要一起分割
输入更多的数学术语,我想生成2个随机数,其余的商为0
我这样做了:
def operation
operators = [:/, :+, :-, :*]
@operation = operators.sample
end
def result(num1, num2)
if @operation == :/
unless num1 % num2 != 0
numbers
else
@result = @num1.send(@operation, @num2)
end
else
@result = @num1.send(@operation, @num2)
end
end
def numbers
@num1 = rand(1..100)
@num2 = rand(1..100)
end
numbers
result(@num1,@num2)
这个想法是,除非两个数字的剩余部分为0,否则它将再次返回数字方法。我相信这里有一些迭代问题,因为我收到错误'`result':nil不是符号也不是字符串(TypeError)'
THX
答案 0 :(得分:0)
您没有调用方法operation
,因此@operation
将为零。因此,当您致电@operation
时,使用send
作为方法名称无效。\
我建议你重构一些东西,这样你就不会在实例变量中存储一堆状态。相反,使用函数参数将任何数据传递到函数中。
答案 1 :(得分:0)
要确保采样中没有偏差,必须首先构造满足指定条件的所有对的Universe。你可以这样做。
数字的范围可以从1
到指定的最大值,比如说
mx = 50
对于mx
的这个值,有效对的列表构造如下。
pairs = (1..mx/2).flat_map { |n| (1..mx/n).map { |m| [n, n*m] } }
#=> [[1, 1], [1, 2],..., [1, 50],
# [2, 2], [2, 4],..., [2, 50],
# [3, 3], [3, 6],..., [3, 48],
# [4, 4], [4, 8],..., [4, 48],
# [5, 5], [5, 10],..., [5, 50],
# [6, 6], [6, 12],..., [6, 48],
# [7, 7], [7, 14],..., [7, 49],
# [8, 8], [8, 16],..., [8, 48],
# [9, 9], [9, 18],..., [9, 45],
# [10, 10], [10, 20],..., [10, 50],
# [11, 11], [11, 22],..., [11, 44],
# [12, 12], [12, 24],..., [12, 48],
# [13, 13], [13, 26], [13, 39],
# [14, 14], [14, 28], [14, 42],
# [15, 15], [15, 30], [15, 45],
# [16, 16], [16, 32], [16, 48],
# [17, 17], [17, 34],
# [18, 18], [18, 36],
# [19, 19], [19, 38],
# [20, 20], [20, 40],
# [21, 21], [21, 42],
# [22, 22], [22, 44],
# [23, 23], [23, 46],
# [24, 24], [24, 48],
# [25, 25], [25, 50]]
pairs_size = pairs.size
#=> 182
现在你可以随机抽取尺寸
的样本sample_size = 10
来自这个人群,要么替换:
sample_size.times.map { pairs[rand pairs_size] }
#=> [[3, 6], [2, 10], [7, 35], [2, 40], [18, 36],
# [1, 45], [11, 22], [2, 40], [1, 6], [9, 36]]
或无需替换:
pairs.sample(sample_size)
#=> [[22, 22], [6, 42], [1, 28], [1, 42], [1, 20],
# [1, 36], [23, 46], [9, 18], [4, 36], [16, 16]]
如果[n, n]
中不包含数组[2, 2]
(例如pairs
),请将上面的块更改为
{ |n| (2..mx/n).map { |m| [n, n*m] } }
在这种情况下pairs.size #=> 157
。