Rubydə təsadüfi bir düstur yaratmaq

Hal-hazırda "A" üçün bir-bir söz-təsadüfi 8-karakter simli yaradıram .. "Z":

 value = ""; 8.times{value << (65 + rand(25)).chr} 

ancaq təmiz bir görünmür və tək bir ifadə olmadığından bir arqument kimi qəbul edilə bilməz. Qarışıq halda simli "a" .. "z" plus "A" .. "Z" almaq üçün onu dəyişdim:

 value = ""; 8.times{value << ((rand(2)==1?65:97) + rand(25)).chr} 

lakin çöp kimi görünür.

Hər kəs daha yaxşı bir üsula sahib mi?

623
18 сент. Jeff 18 Sentyabrda təyin olundu. 2008-09-18 01:24 '08 at 1:24 2008-09-18 01:24
@ 47 cavab
  • 1
  • 2
 (0...8).map { (65 + rand(26)).chr }.join 

Golf oynayan çox vaxt sərf edirəm.

 (0...50).map { ('a'..'z').to_a[rand(26)] }.join 

Daha son dərəcə şaşırtıcı, lakin daha çevik və daha az dövrü olan sonuncu:

 o = [('a'..'z'), ('A'..'Z')].map( string = (0...50).map { o[rand(o.length)] }.join 
824
18 сент. Kent Fredric tərəfindən verilmiş cavab 18 sentyabr 2008-09-18 01:29 '08 saat 01:29 'da 2008-09-18 01:29

Niyə SecureRandom istifadə etmirsiniz?

 require 'securerandom' random_string = SecureRandom.hex # outputs: 5b5cd0da3121fc53b4bc84d0c8af2e81 (ie 32 chars of 0..9, a..f) 

SecureRandom ayrıca aşağıdakı üsullara malikdir:

border=0
  • base64
  • random_bytes
  • random_number

http://ruby-doc.org/stdlib-1.9.2/libdoc/securerandom/rdoc/SecureRandom.html səhifəsinə baxın.

691
25 окт. Cavab 25 metrə ibarətdir. 2009-10-25 03:32 '09 saat 03:32 'da 2009-10-25 03:32

Mən bunu təsadüfi URL yaratmaq üçün istifadə edirəm.

 rand(36**length).to_s(36) 

Təsadüfi kiçik xəttləri az və 0-9 yaradır. Bu çox özelleştirilebilir deyil, qısa və təmizdir.

211
26 авг. Christoffer Möller tərəfindən verilmiş cavab 26 avqust. 2010-08-26 10:34 '10 10:34 'da 2010-08-26 10:34

Bu həll aktivasiya kodları üçün asanlıqla oxunan simvol yaradır; İnsanlar 8 ilə B, 1 ilə I, 0 ilə O, L ilə 1, və s.

 # Generates a random string from a set of easily readable characters def generate_activation_code(size = 6) charset = %w{ 2 3 4 6 7 9 ACDEFGHJKMNPQRTVWXYZ} (0...size).map{ charset.to_a[rand(charset.size)] }.join end 
152
29 янв. Cavab ImNotQuiteJack Jan 29 verilir 2009-01-29 23:20 '09 saat 23:20 'da 2009-01-29 23:20

Digərləri bənzər bir şey söylədilər, ancaq URL-təhlükəsiz bir xüsusiyyət istifadə edir.

 require 'securerandom' p SecureRandom.urlsafe_base64(5) #=> "UtM7aa8" p SecureRandom.urlsafe_base64 #=> "UZLdOkzop70Ddx-IJR0ABg" p SecureRandom.urlsafe_base64(nil, true) #=> "i0XQ-7gglIsHGV2_BNPrdQ==" 

Nəticədə AZ, az, 0-9, "-" və "_" ola bilər. "=" də doldurmanın doğru olduğu halda istifadə olunur.

110
28 авг. Cavab Travis R 28 aug tərəfindən verilir . 2011-08-28 21:21 '11 at 21:21 'da 2011-08-28 21:21
 [*('A'..'Z')].sample(8).join 

Təsadüfi bir 8-məktnluq simli yaradın (məsələn, NVAYXHGR)

 ([*('A'..'Z'),*('0'..'9')]-%w(0 1 IO)).sample(8).join 

0/1 / I / O istisna olmaqla təsadüfi 8-rəqəmli simli yaradın (məsələn, 3PH4SWF2). Ruby 1.9

37
04 янв. Cavab Şai Coleman tərəfindən 04 yanvar 2012-01-04 19:41 '12 at 7:41 pm 2012-01-04 19:41

Mən onu tapdığım yeri xatırlaya bilmirəm, amma mənim üçün bu ən yaxşı və ən az gərgin prosesdir:

 def random_string(length=10) chars = 'abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ0123456789' password = '' length.times { password << chars[rand(chars.size)] } password end 
26
13 июля '09 в 0:40 2009-07-13 00:40 Cavab Travis R tərəfindən 13 iyul '09 'da 0:40 2009-07-13 00:40 tarixində verilir
 require 'securerandom' SecureRandom.urlsafe_base64(9) 
25
13 июля '12 в 3:34 2012-07-13 03:34 Cavab LENZCOM tərəfindən 13 iyul 2012- ci il saat 12: 00-da verilir. 2012-07-13 03:34

Müəyyən uzunluqlu bir simli ehtiyac varsa, istifadə edin:

 require 'securerandom' randomstring = SecureRandom.hex(n) 

0-9af olan təsadüfi uzunluqlu 2n uzunluğu yaradır

18
11 июля '13 в 17:36 2013-07-11 17:36 Cavab Srikanta Mahapatro tərəfindən 11 iyul '13 'də saat 17:36' də verilir 2013-07-11 17:36

Array.new(n){[*"0".."9"].sample}.join .

Array.new(n){[*"A".."Z", *"0".."9"].sample}.join : Array.new(n){[*"A".."Z", *"0".."9"].sample}.join və s. - bu cavabdan

10
29 сент. cavab gr8scott06 29 sep verilir . 2014-09-29 22:51 '14 at 10:51 pm 2014-09-29 22:51
 require 'sha1' srand seed = "--#{rand(10000)}--#{Time.now}--" Digest::SHA1.hexdigest(seed)[0,8] 
10
18 сент. Cavab 18-ci sinifdə verilir . 2008-09-18 01:40 '08 at 1:40 2008-09-18 01:40

Ruby 1.9 +:

 ALPHABET = ('a'..'z').to_a #=> ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"] 10.times.map { ALPHABET.sample }.join #=> "stkbssowre" # or 10.times.inject('') { |s| s + ALPHABET.sample } #=> "fdgvacnxhc" 
8
25 июля '10 в 0:04 2010-07-25 00:04 Cavab Ragmaanir'e 25 iyul 2010- cu ildə 0:04 2010-07-25 00:04 tarixində verilir

Burada uzunluğu 8 təsadüfi bir simli üçün sadə kodun bir xəttidir

  random_string = ('0'..'z').to_a.shuffle.first(8).join 

Siz həmçinin uzunluğu 8 təsadüfi parol üçün istifadə edə bilərsiniz

 random_password = ('0'..'z').to_a.shuffle.first(8).join 

Bu kömək edir və inanılmazdır.

8
19 нояб. Cavab 19 noyabrda Awais verilir. 2014-11-19 09:12 '14 saat 09:12 'da 2014-11-19 09:12

Diqqət edin: rand bir təhqirçi və buna görə də ehtimal təhlükəsiz deyil, proqnozlaşdırılır. Şifre yaratmaq üçün mütləq SecureRandom istifadə etməlisiniz. Bu kimi bir şey istifadə edirəm:

 length = 10 characters = ('A'..'Z').to_a + ('a'..'z').to_a + ('0'..'9').to_a password = SecureRandom.random_bytes(length).each_char.map do |char| characters[(char.ord % characters.length)] end.join 
7
30 марта '13 в 17:30 2013-03-30 17:30 Cavab 30 mart '13, saat 17:30 'da qələmlə verilir . 2013-03-30 17:30

Lent 8 ilə təsadüfi bir parol üçün bir sadə kod

 rand_password=('0'..'z').to_a.shuffle.first(8).join 

Bu kömək edir.

7
15 окт. Cavab Thaha kp 15 oct verilir . 2012-10-15 09:51 '12 at 9:51 2012-10-15 09:51

Bir Ruby Gem facets simalarından String#random istifadə edə bilərsiniz:

https://github.com/rubyworks/facets/blob/126a619fd766bc45588cac18d09c4f1927538e33/lib/core/facets/string/random.rb

əsasən bunu edir:

 class String def self.random(len=32, character_set = ["A".."Z", "a".."z", "0".."9"]) characters = character_set.map { |i| i.to_a }.flatten characters_len = characters.length (0...len).map{ characters[rand(characters_len)] }.join end end 
5
23 авг. cavab Tilo 23 aug tərəfindən verilir . 2014-08-23 01:53 '14 'da 1:53 2014-08-23 01:53
 SecureRandom.base64(15).tr('+/=lIO0', 'pqrsxyz') 

Devise'den bir şey

5
19 апр. Cavab 19 oktyabrda Thorpe Obazee tərəfindən verilir. 2012-04-19 03:25 '12 at 3:25 2012-04-19 03:25

Buraya mənim qəpiklərimi əlavə edin ...

 def random_string(length = 8) rand(32**length).to_s(32) end 
5
27 мая '12 в 13:27 2012-05-27 13:27 cavab 27 may 2012-ci il tarixdə saat 13:27 radələrində pduersteler tərəfindən verilir. 2012-05-27 13:27

Istifadə etmək istərdim başqa bir üsul

  rand(2**256).to_s(36)[0..7] 

Əgər simli düzgün uzunluğu haqqında həqiqətən paranoid olduqda ljust əlavə edin:

  rand(2**256).to_s(36).ljust(8,'a')[0..7] 
5
09 янв. İstifadəçi tərəfindən verilmiş cavab 163365 Jan 09 2010-01-09 02:17 '10 at 2:17 2010-01-09 02:17

Hesab edirəm ki, bu, qısalıq, dəqiqlik və dəyişikliklərin asanlığının yaxşı bir tarazlığıdır.

 characters = ('a'..'z').to_a + ('A'..'Z').to_a # Prior to 1.9, use .choice, not .sample (0..8).map{characters.sample}.join 

Asanlıqla dəyişdirildi

Məsələn, nömrələr daxildir:

 characters = ('a'..'z').to_a + ('A'..'Z').to_a + (0..9).to_a 

Üst vəziyyətdə hexadecimal indeks:

 characters = ('A'..'F').to_a + (0..9).to_a 

Gerçekten etkileyici karakterler dizisi:

 characters = (32..126).to_a.pack('U*').chars.to_a 
5
20 июня '11 в 16:48 2011-06-20 16:48 Cavab Nathan Long tərəfindən 20 İyunda '11 'də saat 16:48' da verildi. 2011-06-20 16:48

En sevdiğim (:A..:Z).to_a.shuffle[0,8].join . Qarışıqlıq üçün Ruby> 1.9 tələb olunur.

4
28 нояб. Cavab 28 noyabr tarixində Josh tərəfindən verilmişdir. 2013-11-28 21:18 '13 at 21:18 2013-11-28 21:18

Bu həll xarici qarışıqlıq tələb edir, lakin digərindən daha gözəl görünür.

  • Gem faker qurun
  • Faker::Lorem.characters(10) # => "ang9cbhoa8"
4
18 сент. cavab verildi asiniy 18 sm . 2015-09-18 19:12 '15 'də saat 19:12 ' da

Mən çox istifadə üçün təsadüfi random_token yaratmaq üçün kiçik təsadüfi təsadüfi bir daş yazın

https://github.com/sibevin/random_token

3
03 дек. cavab Sibevin Wang 03 dekabrda verilir. 2013-12-03 07:01 '13 saat 07:01 'de 2013-12-03 07:01

Verilənlər:

 chars = [*('a'..'z'),*('0'..'9')].flatten 

Bir arqument kimi qəbul edilə bilən tək ifadə, kopya simvollara imkan verir:

 Array.new(len) { chars.sample }.join 
3
20 апр. Tim James'in 20 apreldə cavabladığı cavab 2011-04-20 22:58 '11 at 10:58 pm 2011-04-20 22:58
 ''.tap {|v| 4.times { v << ('a'..'z').to_a.sample} } 
3
04 окт. Cavab 04 oktyabr ayına verilir . 2011-10-04 22:55 '11 saat 22:55 'da 2011-10-04 22:55

Son vaxtlarda 8 simvolu təsadüfən 62 simvol yaratmaq üçün oxşar bir şey etdim. Simvollar 0-9, az, AZ idi. Onlardan bir neçəsi var idi, döngə 8 dəfə idi və arraydan təsadüfi bir dəyər seçimi idi. Bu raylar tətbiqində idi.

str = '' 8.times {|i| str << ARRAY_OF_POSSIBLE_VALUES[rand(SIZE_OF_ARRAY_OF_POSSIBLE_VALUES)] }

Qəribədir ki, mən çox sayda dublikat aldım. İndi təsadüfi bir şəkildə bu baş verməyəcək. 62 ^ 8 böyükdür, amma db-də 1200-dən çox və ya çox kodları var, çox sayda dublikat var idi. Bir-birinin izləmə sərhədlərində meydana gəldiyini fərq etdim. Başqa sözlə, mən 12:12:23 və 2:12:22-də bir dublikat gördüm və ya belə bir şey ... vaxtın və ya problemin olmadığını əminəm.

Bu kod, activerecord obyektini yaratmadan əvvəl yaradılıb. Qeydiyyatın hazırlanmasından əvvəl bu kod işə salındı ​​və "unikal" kod yaradıldı. Db girişləri həmişə etibarlı şəkildə yaradılıb, lakin kod (yuxarıda göstərilən cədvəl) tez-tez çoğaldı.

Mən yuxarıda göstərilən yuxarıda göstərilən 100.000 təkrarlamanı sadə bir gecikmələ yerinə yetirmək üçün bir skript yaratdım, buna görə saatlik bir növ təkrarlanan nümunəni görmək ümidi ilə 3-4 saat çəkə bilərik, amma bir şey görmədim. Niyə bu mənim raylar tətbiqində baş verdiyini bilmirəm.

2
07 авг. Cavab verilir erik 07 avqust. 2010-08-07 23:16 '10 at 11:16 PM 2010-08-07 23:16

cəhd edin

 def rand_name(len=9) ary = [('0'..'9').to_a, ('a'..'z').to_a, ('A'..'Z').to_a] name = '' len.times do name << ary.choice.choice end name end 

Mövzuya cavablar çox xoşuma gəldi, amma həqiqətən çox faydalı idi! Amma mən onlardan heç biri ayamlarımı qane etmirəm, bəlkə bu rand () üsuludur. Array # seçmək üçün bir üsul olduğundan, mənim üçün doğru görünmür.

2
22 февр. Guilamo tərəfindən Manuel A. Guilamo tərəfindən verilmiş cavab 22 fevral 2011-02-22 07:08 '11 at 07:08 2011-02-22 07:08

Başqa bir yoldur:

  • Rand () əvəzinə təhlükəsiz təsadüfi sayda generator istifadə edir
  • URL və fayl adlarında istifadə edilə bilər.
  • Böyük və kiçik harf və nömrələri ehtiva edir.
  • I0l01 qeyri-müəyyən simvolları daxil etmək mümkündürmü?

Tələb require "securerandom"

 def secure_random_string(length = 32, non_ambiguous = false) characters = ('a'..'z').to_a + ('A'..'Z').to_a + ('0'..'9').to_a %w{IO l 0 1}.each{ |ambiguous_character| characters.delete ambiguous_character } if non_ambiguous (0...length).map{ characters[ActiveSupport::SecureRandom.random_number(characters.size)] }.join end 
2
24 авг. Cavab Evgenii 24 aug verilir . 2011-08-24 12:42 '11 at 12:42 'də 2011-08-24 12:42

Bu üsulla özbaşına uzun müddət gedə bilərsiniz. Bu default 6 olaraq təyin edilir.

 def generate_random_string(length=6) string = "" chars = ("A".."Z").to_a length.times do string << chars[rand(chars.length-1)] end string end 
2
18 сент. Cavab Ryan Bigg tərəfindən verilib 18 sentyabr. 2008-09-18 03:53 '08 at 3:53 2008-09-18 03:53

Məncə, Radar ən yaxşı cavab verir, indiyə qədər düşünürəm. Mən bunu bir az dəyişəcəkdim:

 CHARS = ('a'..'z').to_a + ('A'..'Z').to_a def rand_string(length=8) s='' length.times{ s << CHARS[rand(CHARS.length)] } s end 
2
18 сент. cavab webmat 18 verilir . 2008-09-18 05:35 '08 saat 05:35 'da 2008-09-18 05:35
  • 1
  • 2