811

0との間の乱数を生成するにはどうすればよいnですか?

4

17 に答える 17

974

使用するrand(range)

ルビーの乱数から:

6 面ダイスのロールをシミュレートするためにランダムな整数が必要な場合は、次を使用します1 + rand(6)。クラップスのロールは でシミュレートできます2 + rand(6) + rand(6)

最後に、ランダムなフロートが必要な場合は、rand引数なしで呼び出します。


Marc-André Lafortuneが以下の回答で言及しているように (賛成票を投じてください)Ruby 1.9.2 には独自のRandomクラスがあります(Marc-André 自身がデバッグを支援したため、その機能のターゲットは 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)would be20 + Random.rand(11)である理由です。30 を含むので、11 を除いた 0 から 11 までの乱数を考え出す必要があります。Random.rand(int)20..30

于 2008-10-13T18:10:25.520 に答える
601

との間rand(42-10) + 10の乱数を取得するために使用できますが(10は包括的で42は排他的)、Ruby 1.9.3以降、次のように呼び出すことができるより良い方法があります。1042

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

backports私のgemを要求することで、Rubyのすべてのバージョンで利用できます。

Ruby 1.9.2でもRandomクラスが導入されたため、独自の乱数ジェネレーターオブジェクトを作成でき、優れた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

ほとんどの場合、最も簡単なのはrandまたはを使用することRandom.randです。乱数が必要になるたびに新しいランダムジェネレーターを作成するのは、本当に悪い考えです。これを行うと、ランダムジェネレータ自体のプロパティと比較してひどい初期シードアルゴリズムのランダムプロパティを取得します。

したがって、を使用する場合は、できるだけまれにRandom.new呼び出す必要があります。たとえば、一度だけ呼び出して、他の場所で使用する必要があります。MyApp::Random = Random.new

Random.new役立つケースは次のとおりです。

  • あなたは宝石を書いていて、メインプログラムが依存しているかもしれないrand/のシーケンスに干渉したくないRandom.rand
  • 乱数の再現可能なシーケンスを個別に作成する必要があります(たとえば、スレッドごとに1つ)
  • 再現可能な乱数のシーケンスを保存して再開できるようにしたい(Randomオブジェクトをマーシャリングできるので簡単)
于 2010-05-05T14:01:50.417 に答える
47

数字だけでなく 16 進数や uuid も探している場合は、SecureRandomモジュールがActiveSupport1.9.2+ の 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"

ここに文書化されています: Ruby 1.9.3 - モジュール: SecureRandom (lib/securerandom.rb)

于 2012-07-20T11:15:10.923 に答える
38

メソッドで乱数を生成できますrand。メソッドに渡される引数はまたは であるrand必要があり、範囲内の対応する乱数を返します。integerrange

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
于 2012-12-12T20:12:22.187 に答える
22

さて、私はそれを理解しました。どうやら、rand という組み込み (?) 関数があるようです。

rand(n + 1)

誰かがより詳細な回答で答えた場合、私はそれを正解としてマークします。

于 2008-10-13T18:10:10.107 に答える
17

これはどうですか?

n = 3
(0..n).to_a.sample
于 2012-05-23T06:02:22.813 に答える
13

質問に対する最も簡単な答え:

rand(0..n)
于 2015-02-19T18:53:15.537 に答える
6

範囲 = 10..50

ランド(範囲)

また

range.to_a.sample

また

range.to_a.shuffle (これは配列全体をシャッフルし、この配列から最初または最後またはいずれかで乱数を選択してランダムなものを選択できます)

于 2016-04-29T10:32:32.767 に答える
6
rand(6)    #=> gives a random number between 0 and 6 inclusively 
rand(1..6) #=> gives a random number between 1 and 6 inclusively

range オプションは、新しい (1.9 以降と思われる) バージョンの ruby​​ でのみ使用できることに注意してください。

于 2012-11-15T23:31:45.780 に答える
5

rand(range) を行うことができます

x = rand(1..5)
于 2015-08-22T23:09:00.703 に答える
4

Rubyで乱数を取得する簡単な方法は、

def random    
  (1..10).to_a.sample.to_s
end
于 2017-02-16T10:04:47.597 に答える
2

多分それはあなたを助けます。私は自分のアプリでこれを使用します

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

それは私にとってはうまくいきます

于 2016-03-11T13:59:43.713 に答える
2

これはどう?

num = Random.new
num.rand(1..n)
于 2016-03-11T14:31:35.207 に答える
1

最初にsrand()で RNG をシードすることを忘れないでください。

于 2008-10-13T18:15:52.513 に答える
1

array#shuffleランダム化の方法を試す

array = (1..10).to_a
array.shuffle.first
于 2015-01-23T17:42:50.217 に答える