【问题标题】:method that generate numbers unless remaining of quotient is 0 ruby生成数字的方法,除非剩余商为 0 ruby
【发布时间】:2016-08-11 23:24:11
【问题描述】:

我想创建一个生成 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,否则它会再次返回 number 方法。我相信这里有一些迭代问题,因为我收到一个错误'`result':nil is not a symbol nor a string (TypeError)'

谢谢

【问题讨论】:

    标签: ruby operators symbols division


    【解决方案1】:

    您没有调用方法operation,所以@operation 将为零。所以在调用send时使用@operation作为方法名是无效的。\

    我建议你重构一些东西,这样你就不会在实例变量中存储一堆状态。相反,使用函数参数将任何数据传递给函数。

    【讨论】:

      【解决方案2】:

      为确保抽样中没有偏差,您必须首先构建满足指定条件的所有对的全域。你可以这样做。

      数字的范围可以从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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-06
        • 1970-01-01
        • 2013-11-22
        • 1970-01-01
        • 2010-11-13
        • 1970-01-01
        相关资源
        最近更新 更多