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


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.