如何在Ruby中获得一个随机数字

我如何生成0n之间的随机数字?

rand(range)什么问题?

从Ruby随机数字 :

如果你需要一个随机整数来模拟一个六面骰子,你可以使用: 1 + rand(6) 。 掷骰子可以用2 + rand(6) + rand(6)来模拟。

最后,如果你只需要一个随机的float,只需要调用rand而不需要参数。


正如Marc-AndréLafortune在他的回答中提到的那样, Ruby 1.9.2有自己的Random类 (Marc-André自己帮助debugging ,因此1.9.2的目标就是这个特性)。

例如,在这个游戏中你需要猜测10个数字 ,你可以用下面的代码对它们进行初始化:

 10.times.map{ 20 + Random.rand(11) } #=> [26, 26, 22, 20, 30, 26, 23, 23, 25, 22] 

注意:

  • 使用Random.new.rand(20..30) (使用Random.new )一般不会是一个好主意,正如Marc-AndréLafortune在( 他)的回答 (再次)中详细解释的那样。

  • 但是,如果你不使用Random.new ,那么类方法rand只会取得一个max ,而不是一个Range ,就像在注释中指出的那样(精力充沛)指出了Random )的文档 。 只有实例方法可以使用Range ,如通过生成7位数的随机数所示。

这就是为什么Random.new.rand(20..30)等价于20 + Random.rand(11) ,因为Random.rand(int)返回“一个大于或等于零且小于20..30包括30,我需要拿出0到11之间的一个随机数,不包括11。

虽然你可以使用rand(42-10) + 10来获得rand(42-10) + 1042之间的随机数(其中10是包含的,42是独占的),但是从Ruby 1.9.3开始,你可以调用更好的方法:

 rand(10...42) # => 13 

可用于所有版本的Ruby,需要我的backports gem。

Ruby 1.9.2也引入了Random类,所以你可以创build你自己的随机数生成器对象,并有一个很好的API:

 r = Random.new r.rand(10...42) # => 22 r.bytes(3) # => "rnd" 

Random类本身作为一个随机生成器,所以你直接调用:

 Random.rand(10...42) # => same as rand(10...42) 

Random.new注意事项

在大多数情况下,最简单的是使用randRandom.rand 。 每次你想要一个随机数时创build一个新的随机生成器是一个非常糟糕的主意 。 如果你这样做,你会得到初始播种algorithm的随机性质,这与随机生成器本身的属性相比是非常残酷的。

如果使用Random.new ,则应该尽可能less地调用它,例如一次使用MyApp::Random = Random.new并在其他地方使用。

Random.new有帮助的情况如下:

  • 你正在写一个gem,不想干扰rand / Random.rand这个主程序可能依赖的序列
  • 你需要单独的可重复序列的随机数字(比如每个线程一个)
  • 你希望能够保存和恢复一个可重复的随机数序列(就像Random对象可以编组一样简单)

如果你不只是寻找一个数字,但也是hex或uuid值得一提的是, SecureRandom模块find了从ActiveSupportActiveSupport的ruby核心的方式。 所以不需要一个完整的框架:

 require 'securerandom' p SecureRandom.random_number(100) #=> 15 p SecureRandom.random_number(100) #=> 88 p SecureRandom.random_number #=> 0.596506046187744 p SecureRandom.random_number #=> 0.350621695741409 p SecureRandom.hex #=> "eb693ec8252cd630102fd0d0fb7c3485" 

这里logging: Ruby 1.9.3 – 模块:SecureRandom(lib / securerandom.rb)

您可以使用rand方法生成一个随机数。 传递给rand方法的参数应该是一个integerrange ,并返回一个range相应的随机数:

 rand(9) # this generates a number between 0 to 8 rand(0 .. 9) # this generates a number between 0 to 9 rand(1 .. 50) # this generates a number between 1 to 50 #rand(m .. n) # m is the start of the number range, n is the end of number range 

那么,我明白了。 显然有一个称为rand的内build(?)函数:

 rand(n + 1) 

如果有人回答更详细的答案,我会将其标记为正确的答案。

那这个呢?

 n = 3 (0..n).to_a.sample 

对这个问题最简单的回答:

 rand(0..n) 
 rand(6) #=> gives a random number between 0 and 6 inclusively rand(1..6) #=> gives a random number between 1 and 6 inclusively 

请注意,范围选项只适用于较新的(1.9 +我相信)版本的ruby。

你可以简单地使用random_number

如果以n给出正整数,则random_number返回整数:0 <= random_number <n。

像这样使用它:

 any_number = SecureRandom.random_number(100) 

输出将是0到100之间的任何数字。

这个链接对此会有所帮助。

http://ruby-doc.org/core-1.9.3/Random.html

下面的一些比ruby中的随机数更清晰;

生成一个从0到10的整数

 puts (rand() * 10).to_i 

以更可读的方式生成一个从0到10的数字

 puts rand(10) 

从10到15生成一个数字,包括15

 puts rand(10..15) 

非随机数字

每次程序运行时生成相同的数字序列

 srand(5) 

生成10个随机数字

 puts (0..10).map{rand(0..10)} 

你可以做兰特(范围)

 x = rand(1..5) 

范围= 10..50

兰特(范围)

要么

range.to_a.sample

要么

range.to_a.shuffle (这将洗牌整个数组,你可以select一个随机数字首先或最后或任何从这个数组中挑选随机)

尝试使用array#shuffle方法进行随机化

 array = (1..10).to_a array.shuffle.first 

也许它会帮助你。 我在我的应用程序中使用这个

 https://github.com/rubyworks/facets class String # Create a random String of given length, using given character set # # Character set is an Array which can contain Ranges, Arrays, Characters # # Examples # # String.random # => "D9DxFIaqR3dr8Ct1AfmFxHxqGsmA4Oz3" # # String.random(10) # => "t8BIna341S" # # String.random(10, ['a'..'z']) # => "nstpvixfri" # # String.random(10, ['0'..'9'] ) # => "0982541042" # # String.random(10, ['0'..'9','A'..'F'] ) # => "3EBF48AD3D" # # BASE64_CHAR_SET = ["A".."Z", "a".."z", "0".."9", '_', '-'] # String.random(10, BASE64_CHAR_SET) # => "xM_1t3qcNn" # # SPECIAL_CHARS = ["!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-", "_", "=", "+", "|", "/", "?", ".", ",", ";", ":", "~", "`", "[", "]", "{", "}", "<", ">"] # BASE91_CHAR_SET = ["A".."Z", "a".."z", "0".."9", SPECIAL_CHARS] # String.random(10, BASE91_CHAR_SET) # => "S(Z]z,J{v;" # # CREDIT: Tilo Sloboda # # SEE: https://gist.github.com/tilo/3ee8d94871d30416feba # # TODO: Move to random.rb in standard library? def self.random(len=32, character_set = ["A".."Z", "a".."z", "0".."9"]) chars = character_set.map{|x| x.is_a?(Range) ? x.to_a : x }.flatten Array.new(len){ chars.sample }.join end end 

https://github.com/rubyworks/facets/blob/5569b03b4c6fd25897444a266ffe25872284be2b/lib/core/facets/string/random.rb

这对我来说可以

这个怎么样?

 num = Random.new num.rand(1..n) 

简单的方法来获得随机数在ruby是,

 def random (1..10).to_a.sample.to_s end 

不要忘记首先用srand()播种RNG。