คำตอบ:
ใช้ rand(range)
จากหมายเลขสุ่มทับทิม :
1 + rand(6)
หากคุณจำเป็นต้องเป็นจำนวนเต็มสุ่มเพื่อจำลองม้วนตายหกด้านที่คุณต้องการใช้:2 + rand(6) + rand(6)
ม้วนในลูกเต๋าชนิดหนึ่งอาจจะมีการจำลองด้วยท้ายที่สุดถ้าคุณต้องการทุ่นแบบสุ่มเพียงแค่โทร
rand
โดยไม่มีข้อโต้แย้ง
ในฐานะที่เป็นMarc-André Lafortuneกล่าวถึงในคำตอบของเขาด้านล่าง (ขึ้นไปโหวต) , Ruby 1.9.2 มีRandom
คลาสของตัวเอง (Marc-Andréนั้นเองช่วยให้ debug , ดังนั้น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
Random
คลาสใหม่แต่มันเป็นความคิดที่แย่มากที่จะโทรหาคุณRandom.new
หลาย ๆ ครั้งเหมือนในตัวอย่างของคุณ ฉันได้แก้ไขคำตอบของฉันเพื่อระบุว่า
Random.rand
ไม่ยอมรับช่วงจริง (ตั้งแต่ 1.9.3 ฉันเชื่อ)
ในขณะที่คุณสามารถใช้rand(42-10) + 10
เพื่อรับหมายเลขสุ่มระหว่าง10
และ42
(โดยที่ 10 รวมและ 42 พิเศษ) มีวิธีที่ดีกว่าตั้งแต่ Ruby 1.9.3 ซึ่งคุณสามารถโทรได้:
rand(10...42) # => 13
มีให้สำหรับทับทิมทุกรุ่นโดยต้องการbackports
อัญมณีของฉัน
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
ว่าโปรแกรมหลักอาจต้องพึ่งพาRandom
วัตถุสามารถ marshalled)backports
อัญมณีของฉันเป็นเพียงชุดของวิธีการใหม่สำหรับ RUby 1.8.7, 1.9.1, 1.9.2 แต่มีการใช้งานใน Ruby ฉันใช้ RubySpec เพื่อรับรองว่าผลลัพธ์เข้ากันได้กับ Ruby
Random.rand(10..42)
ไม่ทำงาน, ไม่เป็นผล. Random.rand
วิธีการเรียนไม่ยอมรับช่วง (ทับทิม 1.9.2p180)
หากคุณไม่เพียง แต่กำลังมองหาตัวเลข แต่ยังเป็นเลขฐานสิบหกหรือ uuid ก็คุ้มค่าที่จะกล่าวถึงว่าSecureRandom
โมดูลนั้นหามาได้จากActiveSupport
ไปยังแกนทับทิมใน 1.9.2+ ดังนั้นโดยไม่จำเป็นต้องมีกรอบการทำงานแบบเต็มเป่า:
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)
SecureRandom.random_number(1000..9999)
SecureRandom.random_number()
ไม่ใช้ช่วงดังนั้นไม่ คุณอาจต้องการบางสิ่งเช่นSecureRandom.random_number(10_000)
(สำหรับ 0-9999) หรือSecureRandom.random_number(9_000)+1_000
(สำหรับ 1,000-9999)
คุณสามารถสร้างตัวเลขสุ่มด้วยrand
วิธีการ อาร์กิวเมนต์ที่ส่งไปยังrand
เมธอดควรเป็นinteger
a หรือ a 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(1..6)
rand(6)+1
ฉันก็คิดออก เห็นได้ชัดว่ามีฟังก์ชั่น builtin (?) ที่เรียกว่า rand:
rand(n + 1)
หากมีคนตอบด้วยคำตอบที่ละเอียดกว่านี้ฉันจะทำเครื่องหมายว่าเป็นคำตอบที่ถูกต้อง
แล้วเรื่องนี้ล่ะ
n = 3
(0..n).to_a.sample
rand
O (1)
คำตอบที่ง่ายที่สุดสำหรับคำถาม:
rand(0..n)
คุณสามารถใช้ random_number
คุณก็สามารถใช้
หากได้รับจำนวนเต็มบวกเป็น n random_number
จะส่งคืนจำนวนเต็ม: 0 <= random_number
<n
ใช้แบบนี้:
any_number = SecureRandom.random_number(100)
เอาต์พุตจะเป็นตัวเลขใด ๆ ระหว่าง 0 ถึง 100
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 1.9.3+
ผมเชื่อว่าตัวเลือกช่วงนี้จะใช้ได้เฉพาะใน มันไม่ทำงาน1.9.2
เมื่อฉันพยายามอย่างน้อย
ช่วง = 10..50
แรนด์ (ช่วง)
หรือ
range.to_a.sample
หรือ
range.to_a.shuffle (การทำเช่นนี้จะเป็นการสลับทั้งอาร์เรย์และคุณสามารถเลือกหมายเลขสุ่มโดยเลือกหนึ่งหรือสุดท้ายหรือใดก็ได้จากอาร์เรย์นี้เพื่อเลือกสุ่ม)
range.to_a.sample
เป็นความคิดที่น่ากลัวเมื่อตัวอย่างมีขนาดใหญ่
คุณสามารถทำแรนด์ (ช่วง)
x = rand(1..5)
ลิงค์นี้จะมีประโยชน์เกี่ยวกับเรื่องนี้;
http://ruby-doc.org/core-1.9.3/Random.html
และความชัดเจนยิ่งขึ้นด้านล่างของตัวเลขสุ่มในทับทิม
สร้างจำนวนเต็มตั้งแต่ 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)}
วิธีง่ายๆในการรับจำนวนสุ่มในทับทิมคือ
def random
(1..10).to_a.sample.to_s
end
บางทีมันอาจช่วยคุณได้ ฉันใช้สิ่งนี้ในแอพของฉัน
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
มันใช้งานได้ดีสำหรับฉัน
แล้วอันนี้ละ?
num = Random.new
num.rand(1..n)
ลองarray#shuffle
วิธีการสุ่ม
array = (1..10).to_a
array.shuffle.first
.shuffle.first
ด้วย.sample
!
srand <some_number>
ก่อนการเขียนrand
จะทำให้คุณมีลำดับการสุ่มหลอก (เช่นทำซ้ำได้) หากคุณต้องการ ruby-doc.org/core-2.5.6/Random.html#method-c-srand