Ruby-də təsadüfi sayını necə əldə etmək olar?

0n arasında təsadüfi bir sıra yaratmaq üçün necə?

667
13 окт. Mark A. Nicolosi tərəfindən 13 oktyabr 2008-10-13 21:07 '08 saat 09:07 'da 2008-10-13 21:07
@ 17 cavab

rand(range) ilə rand(range) nədir?

Ruby Random Nömrələr :

Əgər altıbucaqlı bir matrisin rulonunu simulyasiya etmək üçün təsadüfi tamsayıya ehtiyacınız varsa, istifadə etməlisiniz: 1 + rand(6) . 2 + rand(6) + rand(6) istifadə edərək bülletenlərdə bir rulonun simulyasiyası mümkündür.

Nəhayət, yalnız təsadüfi bir float ehtiyac varsa, yalnız arqumentlər olmadan rand çağırırıq.


Marc-Andre Lafortoun aşağıdakı cavabında qeyd edir (yuxarıya keçin) , Ruby 1.9.2 öz Random sinifinə sahibdir (Marc-André özü də bu işə görə 1.9.2 hədəfini düzəltməyə kömək etdi ).

Məsələn, bu oyunda, 10 nömrəni tapmaq lazımdır , onlardan istifadə edə bilərsiniz

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

Qeyd:

Buna görə Random.new.rand(20..30) ekvivalenti Random.new.rand(20..30) 20 + Random.rand(11) , çünki Random.rand(int) "sıfırdan və ya daha az və arqumentdən daha az bir təsadüfi tamsayı" qaytarır. 20..30 daxildir 30, 11 istisna olmaqla, 20..30 11-ə təsadüfi bir nömrə tapmaq lazımdır.

842
13 окт. Cavab 13 oktyabrda VonC tərəfindən verilir . 2008-10-13 21:10 '08 saat 21:10 'da 2008-10-13 21:10

İndi, rand(42-10) + 10 edərək, 1042 (burada 10 və 42 eksklüziv), təsəvvür edə bilərsiniz Ruby 1.9.3 ilə daha yaxşı bir təsadüfi rəqəm almaq üçün istifadə edə bilərsiniz:

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

Ruby'nin bütün versiyalarında mövcuddur, mənim backports gem tələb edir.

Ruby 1.9.2 də təsadüfi sayını təqdim etdi, belə ki, öz təsadüfi ədəd generatorları yarada və yaxşı bir API var:

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

Sınıfın təsadüfi təsadüfi bir generator kimi təsadüf edir, buna görə də birbaşa çağırırsınız:

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

Random.new üçün Random.new

Çox hallarda ən sadə rand və ya Random.rand istifadə Random.rand . Təsadüfi sayda istədiyiniz hər zaman yeni təsadüfi generator yaratmaq həqiqətən pis bir fikirdir. Bunu edərsəniz, özbaşına generatorun xüsusiyyətlərinə görə qorxunc olan orijinal toxum alqoritminin təsadüfi xüsusiyyətlərini alacaqsınız .

Random.new istifadə Random.new , məsələn, bir dəfə MyApp::Random = Random.new kimi mümkün qədər az olmalıdır və hər yerdə istifadə edin.

Random.new faydalı olduğu zamanlar ola bilər:

  • Siz bir daş Random.rand əsas proqramların arxalana biləcəyi rand / Random.rand müdaxilə etmək istəmirsiniz.
  • təsadüfi ədədlərin təkrarlanan təkrarlanmalı sıralarına ehtiyacınız var (məsələn, akış başına bir)
  • təsadüfi ədədlərin oynatılamayacaq bir ardıcıllığını saxlamaq və bərpa etmək (asanlıqla, Random obyektlərin sıralana bilər)
547
05 мая '10 в 17:01 2010-05-05 17:01 Marc-André Lafortune- yə cavab verdi 05 May '10 at 17:01 2010-05-05 17:01

Yalnız bir ədəd deyil, həm də hex və ya uuid üçün arıyorsanız, SecureRandom modulu ActiveSupport ruby ActiveSupport yol tapdığını xatırlatmaq lazımdır. Beləliklə, tam miqyaslı bir struktur yaratmaq lazım deyil:

 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" 

Burada təsvir olunur: Ruby 1.9.3 - Modul: SecureRandom (lib / securerandom.rb)

42
20 июля '12 в 14:15 2012-07-20 14:15 Cavab Thomas Fankhauser tərəfindən 20 İyul, '12 'də saat 14:15 ' də veriləcək 2012-07-20 14:15

rand metodundan istifadə edərək təsadüfi bir sıra yarada bilərsiniz. rand metoduna rand dəlil integer və ya rand olmalıdır və müvafiq təsadüfi sayını range qaytarır:

 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 
30
12 дек. Cavab 12.12.12 tarixində user1389938 tərəfindən verilir. 2012-12-12 23:12 '12 at 23:12 2012-12-12 23:12

Bəli, mən onu alıram. Göründüyü kimi, daxili funksiyası (?) Var, Rand deyilir:

 rand(n + 1) 

Kimsə daha ətraflı cavab verərsə, onu düzgün cavab olaraq qeyd edəcəyəm.

19
13 окт. Mark A. Nicolosi tərəfindən verilmiş cavab 13 oktyabr 2008-10-13 21:10 '08 saat 21:10 'da 2008-10-13 21:10

Bununla necə?

 n = 3 (0..n).to_a.sample 
18
23 мая '12 в 9:02 2012-05-23 09:02 Cavab 23 may, saat 12: 00-da Rimian'a verilib. 09:02 2012-05-23 09:02

Suala ən asan cavab:

 rand(0..n) 
9
19 февр. Cavab 19 fevralda verilir 2015-02-19 21:53 '15 'da 21:53' de, 2015-02-19 21:53
 rand(6) #=> gives a random number between 0 and 6 inclusively rand(1..6) #=> gives a random number between 1 and 6 inclusively 

Xatırladaq ki, sıra seçimi yalnız ruby ​​(1.9+) yeni versiyalarında mövcuddur.

5
16 нояб. Cavab 16 noyabr tarixində Josh tərəfindən verilmişdir. 2012-11-16 02:31 '12 saat 02:31 'da 2012-11-16 02:31

random_number istifadə edə bilərsiniz.

Müsbət bir tamsayı n kimi random_number , random_number bir tamsayı qaytarır: 0 <= random_number <n.

Aşağıdakı kimi istifadə edin:

 any_number = SecureRandom.random_number(100) 

Çıxış 0'dan 100'e qədər hər hansı bir sayı olacaq.

4
16 янв. Texnologiya ilə cavab 16 yanvar 2017-01-16 14:58 '17 at 2:58 pm 2017-01-16 14:58

Bu link bunun üçün faydalı olacaq;

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

Yaqutda təsadüfi ədədlərdən bir az daha aydınlıq;

0 ilə 10 arasında bir tamsayı yaradın

 puts (rand() * 10).to_i 

0 ilə 10 arasında bir ədədi yaradın daha oxunaqlı bir formada

 puts rand(10) 

10-dan 15-ə qədər bir sıra yaradın

 puts rand(10..15) 

Təsadüfi təsadüfi ədəd deyil

Proqramın hər dəfə başladığı nömrə eyni sıra yaradın.

 srand(5) 

10 təsadüfi ədəd yaradın

 puts (0..10).map{rand(0..10)} 
3
24 дек. cavab Samar Kr Mişra tərəfindən verilmişdir 24 dekabr. 2013-12-24 20:38 '13 saat 20:38 'də 2013-12-24 20:38

rand edə bilərsiniz (sıra)

 x = rand(1..5) 
3
23 авг. cavab Snifferdog 23 aug verilir . 2015-08-23 02:09 '15 at 2:09 2015-08-23 02:09

sıra = 10..50

Rand (sıra)

və ya

range.to_a.sample

və ya

range.to_a.shuffle (bu, bütün diziyi qarışdıracaq və təsadüfi birini seçmək üçün ilk və ya sonuncu və ya bu arraydən hər hansı bir təsadüfi sayını seçə bilərsiniz)

3
29 апр. Cavab 29 apr üzrə sumit verilir . 2016-04-29 13:32 '16 saat 13:32 'da 2016-04-29 13:32

Randomize etmək üçün array#shuffle sınayın

 array = (1..10).to_a array.shuffle.first 
2
23 янв. LuckyElf 23 yanvarda cavab verdi 2015-01-23 20:42 '15 at 8:42 pm 2015-01-23 20:42

Bəlkə də bu sizə kömək edəcək. Mənim müraciətimdə istifadə edirəm.

 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

Mənim üçün böyük işləyir.

2
11 марта '16 в 16:59 2016-03-11 16:59 cavab 11 mart '16 'da saat 16:59' də verildi

Bununla necə?

 num = Random.new num.rand(1..n) 
1
11 марта '16 в 17:31 2016-03-11 17:31 Cavab Juan Dela Cruz tərəfindən 11 Mart '16' da 17:31 2016-03-11 17:31 'də verildi

Yaqutda təsadüfi bir sıra almaq üçün asan bir yol,

 def random (1..10).to_a.sample.to_s end 
1
16 февр. Cavab 16 fevralda verilir . 2017-02-16 13:04 '17 at 13:04 2017-02-16 13:04

RNG-i ilk srand () ilə əkmək üçün yadda saxla.

0
13 окт. Cavab Liebach tərəfindən 13 oktyabrda verilir . 2008-10-13 21:15 '08 saat 21:15 'da 2008-10-13 21:15