生成数字的方法,除非剩余商是0 ruby

时间:2016-08-11 23:24:11

标签: ruby operators symbols division

我想创建一个生成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

2 个答案:

答案 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