কিভাবে রুবি এলোমেলো নম্বর পেতে


786

আমি কীভাবে 0এবং এর মধ্যে একটি এলোমেলো সংখ্যা তৈরি করতে পারি n?


কোড srand <some_number>লেখার আগে ব্যবহার করা randআপনাকে একটি ডিস্ট্রিমেন্টিক (অর্থাত্ পুনরাবৃত্তযোগ্য) সিউডো-এলোমেলো ক্রম দেয়, যদি আপনার এটির প্রয়োজন হয়। রুবি
ডোক.আর.অর্গ.ওকোর

উত্তর:


951

ব্যবহার rand(range)

থেকে রুবি র্যান্ডম সংখ্যা :

আপনি যদি একটি ছয় একতরফা ডাই একটি রোল অনুকরণ একটি র্যান্ডম পূর্ণসংখ্যা প্রয়োজন থাকে, তাহলে আপনি ব্যবহার করতে চাই: 1 + rand(6)। ক্রেপস মধ্যে একটি রোল সঙ্গে অনুকরণ করা যেতে পারে 2 + rand(6) + rand(6)

শেষ অবধি, আপনার যদি কেবল একটি এলোমেলো ফ্লোটের প্রয়োজন হয়, কেবল randকোনও যুক্তি ছাড়াই কল করুন ।


মার্ক-আন্দ্রে লাফোর্টুন যেমন নীচে তার উত্তরে উল্লেখ করেছেন (এটি উপরে যান) , রুবির ১.৯.২ এর নিজস্ব Randomশ্রেণি রয়েছে (যে মার্কটি -আন্দ্রে নিজেই ডিবাগ করতে সহায়তা করেছিলেন , সুতরাং সেই বৈশিষ্ট্যের জন্য ১.৯.২ লক্ষ্য )।

উদাহরণস্বরূপ, এই গেমটিতে যেখানে আপনার 10 নম্বর অনুমান করা দরকার , আপনি সেগুলি দিয়ে আরম্ভ করতে পারেন:

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

বিঃদ্রঃ:

এই কেন এর সমতূল্য Random.new.rand(20..30)হবে 20 + Random.rand(11)সাল থেকে Random.rand(int)আয় "চেয়ে একটি র্যান্ডম পূর্ণসংখ্যা শূন্যের চেয়ে বড় বা এবং সমান যুক্তি কম ।" 20..30৩০ টি অন্তর্ভুক্ত রয়েছে, আমাকে ১১ টি বাদ দিয়ে 0 এবং 11 এর মধ্যে একটি এলোমেলো সংখ্যা নিয়ে আসতে হবে।


2
এটি কি ভয়াবহ অ-রুবি-জাতীয় নয়? আমি ভেবেছিলাম সবকিছুই একটি অবজেক্ট, কম-আশ্চর্য এবং এটি ...
ড্যান রোজনস্টার্ক

1
@ ইয়ার: এটি কিছুটা "পেরিশ"। এখন রুবির এটির এলোমেলো ক্লাস রয়েছে (আমার উত্তর দেখুন)
মার্ক-আন্ড্রে লাফোর্টুন

3
@ ভনসি: নতুন Randomক্লাসের উল্লেখ করার জন্য আপনি নিজের উত্তরটি সম্পাদনা করেছেন এটি দুর্দান্ত , তবে Random.newআপনার উদাহরণের মতো একাধিকবার কল করা ভয়ানক ধারণা । আমি আমার উত্তরটি সম্পাদন করেছি যে তা জানাতে।
মার্ক-আন্দ্রে লাফোর্টুন

2
@ ভনসি আহ :) দুঃখিত আমি যদি কিছুটা কঠোর হও তবে এটি আমাকে অবাক করে দিয়েছিল
ঘোড়াগুয়ে

1
Random.rand আসলে একটি পরিসীমা গ্রহণ করে না। (১.৯.৩ থেকে, আমি বিশ্বাস করি))
আজেদি 32

591

আপনি যখন এবং (যেখানে 10 অন্তর্ভুক্ত এবং 42 একচেটিয়া) এর rand(42-10) + 10মধ্যে একটি এলোমেলো নম্বর পেতে ব্যবহার করতে পারেন তবে রুবি ১.৯.৩ এর থেকে আরও ভাল উপায় আছে যেখানে আপনি কল করতে পারবেন:1042

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

আমার backportsরত্নটি প্রয়োজনীয় করে রুবির সমস্ত সংস্করণের জন্য উপলব্ধ ।

রুবি ১.৯.২ ক্লাসটিও চালু করেছিল Randomযাতে আপনি নিজের র্যান্ডম সংখ্যার জেনারেটর অবজেক্ট তৈরি করতে পারেন এবং একটি দুর্দান্ত এপিআই পাবেন:

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বস্তুগুলি মার্শাল করতে পারে এমন সহজ )

1
অসাধারণ! +1 টি। নতুন বৈশিষ্ট্যটি প্রতিফলিত করার জন্য আমি আমার নিজের উত্তরটি সম্পূর্ণ করেছি (এবং বাগ # 3104 এর সাথে আপনার অবদানের উল্লেখ করছি))।
ভোনসি

1
@ ইয়ার: আমার backportsরত্নটি কেবলমাত্র পদ্ধতিগুলির একটি সংকলন যা রুবিতে 1.8.7, 1.9.1, 1.9.2 এ নতুন, তবে এটি রুবিতে প্রয়োগ করা হয়েছে। ফলাফলগুলি রুবির সাথে সামঞ্জস্যপূর্ণ কিনা তা নিশ্চিত করার জন্য আমি রুবিস্পেক ব্যবহার করি।
মার্ক-আন্দ্রে লাফোর্টুন

@ মার্ক-আন্দ্রে লাফোর্টুন, তার জন্য ধন্যবাদ। গতির প্রয়োজনীয়তার কারণে রুবি নন-রুবিতে (সি বা যাই হোক না কেন) কতটা প্রয়োগ করা হয় তা আমার কাছে সবসময়ই আশ্চর্যজনক। তবে তাদের বিরতি
ড্যান রোজেনস্টার্ক

5
Random.rand(10..42)কাজ করে না. Random.randবর্গ পদ্ধতি একটি সীমার গ্রহণ করে না। (রুবি 1.9.2p180)
অশ্বত্যাগ

1
@ ব্যানার: বাহ, আমি নিশ্চিত হয়েছি যে নতুন এপিআই (রেঞ্জ, বাইটস, ইত্যাদি সহ র্যান্ডম অবজেক্টের মাধ্যমে সরাসরি পাওয়া যায়)। পরিসীমা সহ র্যান্ড 1.9.3 এ হবে এবং আমি বাইটগুলির জন্য একটি বৈশিষ্ট্য অনুরোধ করব। আমি আমার উত্তরটি সম্পাদনা করেছি
মার্ক-আন্দ্রে লাফোর্টুন

46

আপনি যদি কেবল একটি সংখ্যার সন্ধানই করেন না তবে হেক্স বা ইউইউডিও এটি উল্লেখযোগ্য যে SecureRandomমডিউলটি ActiveSupport1.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"

এটি এখানে নথিভুক্ত করা হয়েছে: রুবি ১.৯.৩ - মডিউল: সিকিউরআরডম (lib / secrarandom.rb)


আপনার যদি 4 ডিজিটের এলোমেলো নম্বর দরকার হয় তবে কী হবে?
onurozgurozkan

1
onurozgurozkan আমি অনুমান করিSecureRandom.random_number(1000..9999)
JayTarka

1
SecureRandom.random_number()একটি পরিসীমা লাগে না, তাই না। আপনি সম্ভবত SecureRandom.random_number(10_000)(0-9999 এর জন্য) বা SecureRandom.random_number(9_000)+1_000(1000-9999 এর জন্য) চাইবেন।
mwp

1
র্যান্ডম.র্যান্ড (1000..9999)
জেসি ফার্মার

37

আপনি randপদ্ধতিটি দিয়ে একটি এলোমেলো সংখ্যা তৈরি করতে পারেন । randপদ্ধতিতে পাস হওয়া আর্গুমেন্টটি একটি integerবা একটি হওয়া উচিত 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
isomorphismes

21

ঠিক আছে, আমি এটি বের করেছিলাম। স্পষ্টতই একটি বিল্টিন (?) ফাংশন রয়েছে যা র‍্যান্ড নামে পরিচিত:

rand(n + 1)

যদি কেউ আরও বিস্তারিত উত্তর দিয়ে উত্তর দেয় তবে আমি এটিকে সঠিক উত্তর হিসাবে চিহ্নিত করব।


2
হ্যাঁ, এটি কার্নেল মডিউলটিতে অন্তর্নির্মিত।
ক্রিস্টোফ শিয়েস্ল

17

এই সম্পর্কে কি?

n = 3
(0..n).to_a.sample

3
এটি লক্ষ করা উচিত যে এই দ্রবণটি সরবরাহ করে এর মতো সংখ্যার একটি অ্যারে তৈরি করা বড় পরিসরে ভয়াবহ কর্মক্ষমতা রয়েছে কারণ এটি হে (এন) যখন randও (1) হয়।
ট্র্যাভিস


9

আপনি সহজভাবে ব্যবহার করতে পারেন random_number

যদি ধনাত্মক পূর্ণসংখ্যা n হিসাবে দেওয়া হয় তবে random_numberপূর্ণসংখ্যা ফেরত দেয়: 0 <= random_number<n।

এটি এর মতো ব্যবহার করুন:

any_number = SecureRandom.random_number(100) 

আউটপুট 0 এবং 100 এর মধ্যে যে কোনও সংখ্যা হবে।


6
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আমি অন্তত চেষ্টা করার সময় এটি কাজ করে না ।
ব্যাটকিন্স

6

পরিসর = 10..50

RAND (রেঞ্জ)

অথবা

range.to_a.sample

অথবা

range.to_a.shuffle (এটি পুরো অ্যারে বদলে যাবে এবং আপনি এ্যান্ড থেকে প্রথম বা শেষ বা কোনও এলোমেলোভাবে কোনও এলোমেলোভাবে চয়ন করতে পারবেন)


range.to_a.sampleনমুনা বড় হলে একটি ভয়ঙ্কর ধারণা।
গ্রেজগোর্জ

5

আপনি র্যান্ড (পরিসীমা) করতে পারেন

x = rand(1..5)

4

এই লিঙ্কটি এটি সম্পর্কিত সহায়ক হতে চলেছে;

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

রুবিতে এলোমেলো সংখ্যার চেয়ে নীচে আরও কিছু স্পষ্টতা;

0 থেকে 10 পর্যন্ত পূর্ণসংখ্যা তৈরি করুন

puts (rand() * 10).to_i

আরও পঠনযোগ্য উপায়ে 0 থেকে 10 পর্যন্ত একটি সংখ্যা তৈরি করুন

puts rand(10)

15 সহ 10 থেকে 15 পর্যন্ত একটি সংখ্যা তৈরি করুন

puts rand(10..15)

নন-এলোমেলো র্যান্ডম নাম্বার

প্রোগ্রামটি চালানোর সময় সংখ্যার একই ক্রম তৈরি করুন

srand(5)

১০ টি এলোমেলো সংখ্যা তৈরি করুন

puts (0..10).map{rand(0..10)}

এছাড়াও আপনি রুবিতে র্যান্ডম সংখ্যার চেয়ে খুব পরিষ্কার ছবি ধাপে ধাপে এই ব্লগটি অনুসরণ করতে পারেন; sitepPoint.com/tour-random-ruby
স্যাম

4

রুবিতে এলোমেলো নম্বর পাওয়ার সহজ উপায় হ'ল

def random    
  (1..10).to_a.sample.to_s
end

2

হতে পারে এটি আপনাকে সাহায্য করবে। আমি আমার অ্যাপে এটি ব্যবহার করি use

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

এটি আমার জন্য দারুণ কাজ করছে



1

array#shuffleএলোমেলোকরণের জন্য পদ্ধতি চেষ্টা করুন

array = (1..10).to_a
array.shuffle.first

1
আপনার যদি অবশ্যই একটি সম্পূর্ণ অ্যারে তৈরি করা হয় তবে কমপক্ষে এটির .shuffle.firstসাথে প্রতিস্থাপন করুন .sample!
ক্যামিল গৌডেসুন

0

প্রথমে Srand () দিয়ে আরএনজি বীজ করতে ভুলবেন না ।


2
যদি আপনি শ্রান্ড () না কল করেন তবে কি হবে?
অ্যালেক্স বি

21
যদি ইতিমধ্যে না বলা হয় তবে বর্তমান সময় থেকে বীজের সাথে স্বয়ংক্রিয়ভাবে কল করা হবে।
জুলিয়ান এইচ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.