Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何生成随机数的和?_Ruby - Fatal编程技术网

Ruby 如何生成随机数的和?

Ruby 如何生成随机数的和?,ruby,Ruby,如果我有一个从0到70的数字范围,我想选择五个随机数,随机数之和大于140,小于220。我想这样做,直到五个随机数的总和在140到220之间,然后显示这五个随机数* 这就是我目前所做的: 5.times {r=rand (0..70); puts "#{r}"} 或: 纯红宝石 sum = [*0..70].sample(5).inject(&:+) until (140..220) === sum 如果您使用ActiveSupport,那么您可以在纯Ruby中使用sum而不是inj

如果我有一个从0到70的数字范围,我想选择五个随机数,随机数之和大于140,小于220。我想这样做,直到五个随机数的总和在140到220之间,然后显示这五个随机数*

这就是我目前所做的:

5.times {r=rand (0..70); puts "#{r}"}
或:

纯红宝石

sum = [*0..70].sample(5).inject(&:+) until (140..220) === sum
如果您使用ActiveSupport,那么您可以在纯Ruby中使用sum而不是inject&:+。

sum = [*0..70].sample(5).inject(&:+) until (140..220) === sum
如果使用ActiveSupport,则可以使用sum而不是inject&:+

在讨论之后,我想举一个“捉迷藏”的例子,但这似乎不是一个合适的机会。因此,让我用另一种方法毫无例外地做到这一点:

class Object
  def ergo; yield self end
end

numbers.ergo do |ary|
  rslt = ary.sample( 5 ).reduce( :+ )
  boundary === rslt ? rslt : redo
end
在讨论之后,我想举一个“捉迷藏”的例子,但这似乎不是一个合适的机会。因此,让我用另一种方法毫无例外地做到这一点:

class Object
  def ergo; yield self end
end

numbers.ergo do |ary|
  rslt = ary.sample( 5 ).reduce( :+ )
  boundary === rslt ? rslt : redo
end

如果需要实际数字,而不是总和,请使用以下一行:

nums = [*0..70].sample(5) until (140..220) === (nums || []).inject(:+)
如果数字可以重复,请使用此选项:

nums = 5.times.collect {rand(0..70)} until (140..220) === (nums || []).inject(:+)
第二个的多行版本,无统计错误帽尖samuil:

digits = []
valid = 140..220
until valid === digits.inject(:+)
  digits = []
  5.times { digits << rand(0..70) }
end

如果需要实际数字,而不是总和,请使用以下一行:

nums = [*0..70].sample(5) until (140..220) === (nums || []).inject(:+)
如果数字可以重复,请使用此选项:

nums = 5.times.collect {rand(0..70)} until (140..220) === (nums || []).inject(:+)
第二个的多行版本,无统计错误帽尖samuil:

digits = []
valid = 140..220
until valid === digits.inject(:+)
  digits = []
  5.times { digits << rand(0..70) }
end

回答不是很简短,但似乎很清楚,而且是ruby风格

e = Enumerator.new do |y| 
  loop do 
    y << 5.times.map { rand(0..70) }
  end
end

e.find { |ary| (140..220).include? ary.inject(&:+) }

首先,我们定义枚举器,它返回从0..70范围随机的数字批次。稍后,我们将使用find方法查找第一个条目,它将满足140..220范围内求和的条件。

答案不是很短,但看起来非常清晰,而且是ruby风格的

e = Enumerator.new do |y| 
  loop do 
    y << 5.times.map { rand(0..70) }
  end
end

e.find { |ary| (140..220).include? ary.inject(&:+) }

首先,我们定义枚举器,它返回从0..70范围随机的数字批次。稍后,我们将使用find方法查找第一个条目,它将满足140..220范围内求和的条件。

只是为了好玩,这是我能想到的最具声明性的代码:

repeat { (0..70).sample(5) }.detect { |xs| xs.reduce(:+).in?(140...220) }

不存在的抽象的实现留给读者作为练习:-

只是为了好玩,这是我能想到的最具声明性的代码:

repeat { (0..70).sample(5) }.detect { |xs| xs.reduce(:+).in?(140...220) }


不存在的抽象的实现留给读者作为练习:-

您的代码将返回唯一的元素,而问题示例允许重复。前面的符号:+今天不再需要。我保留它是为了兼容性,但是是的。现在不需要注射。我在map中使用了pretzel冒号语法,在map中仍然需要它,所以对我来说更自然。我相信不再需要是不正确的。很少有方法实现类似于_proc的行为,在ruby 1.9中,它被提升为带有&:符号的语言特性。Pretzel冒号是一种语言功能,适用于所有方法,因此最好使用它。@samuil:inject接受来自古代1.8.7的符号,我认为没有理由不使用它。您的代码将返回唯一的元素,而问题示例允许重复。今天不再需要符号AND:+。为了兼容性,我保留了它,但可以。现在不需要注射。我在map中使用了pretzel冒号语法,在map中仍然需要它,所以对我来说更自然。我相信不再需要是不正确的。很少有方法实现类似于_proc的行为,在ruby 1.9中,它被提升为带有&:符号的语言特性。椒盐卷饼冒号是一种语言功能,它适用于每种方法,因此最好使用它。@samuil:inject接受古代1.8.7的符号,我看没有理由不使用它。你的意思是,你想重复这个过程,直到你找到一组5个数字,其总和在140..220范围内?1取重复还是不取重复?2如果这5个数字的总和在140-220之外会发生什么?@samuil是的,并显示这些数字。这与直接生成140和220之间的数字有什么区别?@Jeffrey:概率密度函数肯定会有所不同。你的意思是你想重复这个过程,直到你找到一组5个数字,其总和在140..220范围内?1取重复还是不取重复?2如果这5个数字的总和在140-220之外会发生什么?@samuil是的,并显示这些数字。这与直接在140和220之间生成一个数字有什么不同?@Jeffrey:概率密度函数肯定会有所不同。有趣的是,不久前我和你的想法一样。但比较一下使用StopIteration异常来控制内置枚举器类。如果您真的想使用非循环解决方案,请尝试我自己提供的catch-throw符号+1。但我不确定这种情况是否适用于捕获和抛出。它是使用until循环的最佳场所:sum=numbers.sample5.reduce:+until boundary==sum。抓球投掷也是一个坏例子。@ukaszNiemier:你已经相应地编辑了答案;我添加了另一个未被充分使用的关键词,重做。有趣的是,我和你的想法不一样

五年前。但比较一下使用StopIteration异常来控制内置枚举器类。如果您真的想使用非循环解决方案,请尝试我自己提供的catch-throw符号+1。但我不确定这种情况是否适用于捕获和抛出。它是使用until循环的最佳场所:sum=numbers.sample5.reduce:+until boundary==sum。抓球投掷也是一个坏例子。@ukaszNiemier:你已经相应地编辑了答案;我添加了另一个未充分使用的关键字redo.| |[]在这种情况下的目的是什么?@PeterAlfvin:为了避免在第一次传递时出现无方法错误,因为nums然后是nil。@samuil:我觉得它像英语,但我想你可能有一点。。。如果需要,可以将其改写为多行:-@PeterAlfvin:对我来说,正是第一次通过时的这个零,使许多在线的使用情况变得糟糕,如果,除非,直到等等。你的[*0..70]*5技巧并不等同于每次都取随机数,因为它会产生不同的重复概率。| |[]在这种情况下?@PeterAlfvin:为了避免在第一次传递时出现“无方法”错误,因为nums是nil。@samuil:我觉得它读起来像英语,但我想你可能有一点。。。如果需要,可以将其改写为多行:-@PeterAlfvin:对我来说,正是第一次通过时的这个零,使许多在线的使用情况变得糟糕,如果,除非,直到等等。你的[*0..70]*5技巧并不等同于每次都取随机数,因为它会产生不同的重复概率。这也是一个很好的技巧。我可以在括号周围加上空格吗?这是你的风格吗?ruby中是否有重复函数,就像你建议的那样?我找不到。好吧,你的摘要直接翻译成了我的答案:萨缪尔:不,你必须为范围的样本写相同的摘要,并且写在?。例如:def repeat;Enumerator.new{y|loop{y.yieldyield};end@samuil:这是循环,不要吹毛求疵:-这也是一个很好的循环。我可以在括号周围加上空格吗?这是你的风格吗?ruby中是否有重复函数,就像你建议的那样?我找不到。好吧,你的摘要直接翻译成了我的答案:萨缪尔:不,你必须为范围的样本写相同的摘要,并且写在?。例如:def repeat;Enumerator.new{y|loop{y.yieldyield};end@samuil:这是循环,不要挑剔:-