How do I generate a random number between 0 and n?
18 Answers
Use rand(range)
From Ruby Random Numbers:
If you needed a random integer to simulate a roll of a six-sided die, you'd use:
1 + rand(6). A roll in craps could be simulated with2 + rand(6) + rand(6).Finally, if you just need a random float, just call
randwith no arguments.
As Marc-André Lafortune mentions in his answer below (go upvote it), Ruby 1.9.2 has its own Random class (that Marc-André himself helped to debug, hence the 1.9.2 target for that feature).
For instance, in this game where you need to guess 10 numbers, you can initialize them with:
10.times.map{ 20 + Random.rand(11) } #=> [26, 26, 22, 20, 30, 26, 23, 23, 25, 22] Note:
Using
Random.new.rand(20..30)(usingRandom.new) generally would not be a good idea, as explained in detail (again) by Marc-André Lafortune, in his answer (again).But if you don't use
Random.new, then the class methodrandonly takes amaxvalue, not aRange, as banister (energetically) points out in the comment (and as documented in the docs forRandom). Only the instance method can take aRange, as illustrated by generate a random number with 7 digits.
This is why the equivalent of Random.new.rand(20..30) would be 20 + Random.rand(11), since Random.rand(int) returns “a random integer greater than or equal to zero and less than the argument.” 20..30 includes 30, I need to come up with a random number between 0 and 11, excluding 11.
11 Comments
Random.rand does accept a range, actually. (Since 1.9.3, I believe.)method(:rand) outputs #<Method: Object(Kernel)#rand>. So rand is a Kernel method, available to every Object. You can call self.send(:rand, 0..10) if it makes you feel better.While you can use rand(42-10) + 10 to get a random number between 10 and 42 (where 10 is inclusive and 42 exclusive), there's a better way since Ruby 1.9.3, where you are able to call:
rand(10...42) # => 13 Available for all versions of Ruby by requiring my backports gem.
Ruby 1.9.2 also introduced the Random class so you can create your own random number generator objects and has a nice API:
r = Random.new r.rand(10...42) # => 22 r.bytes(3) # => "rnd" The Random class itself acts as a random generator, so you call directly:
Random.rand(10...42) # => same as rand(10...42) Notes on Random.new
In most cases, the simplest is to use rand or Random.rand. Creating a new random generator each time you want a random number is a really bad idea. If you do this, you will get the random properties of the initial seeding algorithm which are atrocious compared to the properties of the random generator itself.
If you use Random.new, you should thus call it as rarely as possible, for example once as MyApp::Random = Random.new and use it everywhere else.
The cases where Random.new is helpful are the following:
- you are writing a gem and don't want to interfere with the sequence of
rand/Random.randthat the main programs might be relying on - you want separate reproducible sequences of random numbers (say one per thread)
- you want to be able to save and resume a reproducible sequence of random numbers (easy as
Randomobjects can marshalled)
11 Comments
backports gem is simply a collection of methods that are new to RUby 1.8.7, 1.9.1, 1.9.2, but implemented in Ruby. I use RubySpec to insure that the results are compatible with Ruby.Random.rand(10..42) does not work. The Random.rand class method does not accept a range. (Ruby 1.9.2p180)If you're not only seeking for a number but also hex or uuid it's worth mentioning that the SecureRandom module found its way from ActiveSupport to the ruby core in 1.9.2+. So without the need for a full blown framework:
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" It's documented here: Ruby 1.9.3 - Module: SecureRandom (lib/securerandom.rb)
4 Comments
SecureRandom.random_number(1000..9999)SecureRandom.random_number() doesn't take a range, so no. You would probably want something like SecureRandom.random_number(10_000) (for 0-9999) or SecureRandom.random_number(9_000)+1_000 (for 1000-9999).You can generate a random number with the rand method. The argument passed to the rand method should be an integer or a range, and returns a corresponding random number within the 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 1 Comment
rand(1..6) reads clearer than the top answer's rand(6)+1.Well, I figured it out. Apparently there is a builtin (?) function called rand:
rand(n + 1) If someone answers with a more detailed answer, I'll mark that as the correct answer.
1 Comment
What about this?
n = 3 (0..n).to_a.sample 1 Comment
rand is O(1).rand(6) #=> gives a random number between 0 and 6 inclusively rand(1..6) #=> gives a random number between 1 and 6 inclusively Note that the range option is only available in newer(1.9+ I believe) versions of ruby.
1 Comment
ruby 1.9.3+. It didn't work in 1.9.2 when I tried at least.range = 10..50
rand(range)
or
range.to_a.sample
or
range.to_a.shuffle(this will shuffle whole array and you can pick a random number by first or last or any from this array to pick random one)
1 Comment
range.to_a.sample is an awful idea when the sample is big.This link is going to be helpful regarding this;
http://ruby-doc.org/core-1.9.3/Random.html
And some more clarity below over the random numbers in ruby;
Generate an integer from 0 to 10
puts (rand() * 10).to_i Generate a number from 0 to 10 In a more readable way
puts rand(10) Generate a number from 10 to 15 Including 15
puts rand(10..15) Non-Random Random Numbers
Generate the same sequence of numbers every time the program is run
srand(5) Generate 10 random numbers
puts (0..10).map{rand(0..10)} 1 Comment
Maybe it help you. I use this in my app
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 It works fine for me
Comments
Try array#shuffle method for randomization
array = (1..10).to_a array.shuffle.first 1 Comment
.shuffle.first with .sample!You can use ruby rand method for this like below:
rand(n+1) You need to use n+1 as the rand method returns any random number greater than or equal to 0 but less than the passed parameter value.
srand <some_number>before writingrandcode will give you a deterministic (i.e. repeatable) pseudo-random sequence, if you need that. ruby-doc.org/core-2.5.6/Random.html#method-c-srand