আমি কোনও অ্যারে থেকে এলোমেলোভাবে কীভাবে বাছতে পারি?


559

এটির করার আরও অনেক পরিষ্কার উপায় আছে কিনা তা আমি জানতে চাই। মূলত, আমি পরিবর্তনশীল দৈর্ঘ্যের অ্যারে থেকে একটি এলোমেলো উপাদান বেছে নিতে চাই। সাধারণত, আমি এটি এইভাবে করব:

myArray = ["stuff", "widget", "ruby", "goodies", "java", "emerald", "etc" ]
item = myArray[rand(myarray.length)]

দ্বিতীয় লাইনের প্রতিস্থাপনের জন্য আরও পাঠযোগ্য / সহজতর কিছু আছে কি? বা এটি করার সেরা উপায়। আমি মনে করি আপনি করতে পারেন myArray.shuffle.firstতবে আমি #shuffleকয়েক মিনিট আগে কেবলমাত্র এসও-তে দেখেছি , আমি এখনও এটি ব্যবহার করি নি।


13
উত্তরের উত্তর নীচে তবে বদল সম্পর্কে একটি সাধারণ বিষয়। আমি ভাবতে পারি যে পুরো অ্যারেটি সহ্য করা কেবলমাত্র এলোমেলো নম্বর পাওয়ার চেয়ে আরও নিবিড় হবে যাতে এটি যাওয়ার পক্ষে ভাল দিক না হয়।
ডেরেক অরগান

উত্তর:


1127

শুধু ব্যবহার করুন Array#sample:

[:foo, :bar].sample # => :foo, or :bar :-)

এটি রুবি 1.9.1+ এ উপলব্ধ। এটি রুবি এর পূর্ববর্তী সংস্করণ সহ ব্যবহার করতে সক্ষম হতে, আপনি করতে পারেন require "backports/1.9.1/array/sample"

মনে রাখবেন যে রুবি ১.৮.; এ এটি দুর্ভাগ্যজনক নামে রয়েছে choice; এটি পরবর্তী সংস্করণে নতুন নামকরণ করা হয়েছিল যাতে আপনার এটি ব্যবহার করা উচিত নয়।

যদিও এই ক্ষেত্রে দরকারী না হলেও sampleআপনি কয়েকটি স্বতন্ত্র নমুনা চান সে ক্ষেত্রে একটি সংখ্যা যুক্তি গ্রহণ করে।


1
আমার জানা উচিত ছিল যে আপনার জন্য আমার সঠিক উত্তর হবে (যেহেতু আমি এখানে ব্রাউজ করি বেশিরভাগ রুবি প্রশ্নগুলি আপনার ইনপুটটি কোথাও রয়েছে)। আমি আনন্দিত আপনি সংস্করণটি নির্দেশ করেছেন; আমি ব্যবহার করছি 1.9.2। এপিডক (ম্লাদেনের মন্তব্য) এর নমুনা নেই; রুবি-ডকও না আপনার মতে, রুবীর জন্য সর্বোত্তম রেফারেন্সটি কীভাবে আপডেট হয়েছে 1.9?
পল হাফার

পাশের নোটে, আমি প্রথমে অন্য উত্তরটি নির্বাচন করার পরে "সঠিক উত্তর" পরিবর্তন করা কি যথাযথ?
পল হাফার

1
ধন্যবাদ :-) এবং হ্যাঁ, এটি উত্সাহিত হয়েছে (দেখুন মেটা.স্ট্যাকেক্সেঞ্জার.কম / সেকশনস / ১৯৯৪৮/২ )
মার্ক-আন্দ্রে লাফোর্টুন

আমি আপনার সম্পাদনাটি 1.8.8 উল্লেখ উল্লেখ অপসারণ করে লক্ষ্য করেছি। এটি কি এখনও 1.8-হেডে উপলব্ধ এবং আপনি কেবল প্রশ্নটি সম্পাদনা করছেন কারণ 1.8.8 ঘটবে না?
অ্যান্ড্রু গ্রিম

3
@ অ্যান্ড্রু: হ্যাঁ, আমি আমার উত্তরটি সম্পাদনা করেছি কারণ ১.৮.৮ ঘটবে না। এটি এখনও 1.8-মাথা হওয়া উচিত, তবে সেই শাখাটি মারা গেছে :-(
মার্ক-আন্দ্রে লাফোর্টুন

84

myArray.sample(x) অ্যারে থেকে এক্স এলোমেলো উপাদান পেতে আপনাকে সহায়তা করতে পারে।


6
এটা লক্ষণীয় যে my_array.sample (1)! = My_array.sample
পুনরুত্থান

5
@ রেডিথিয়ন এটিও লক্ষণীয়, এটির মধ্যে পার্থক্য: my_array.sample (1) == [নমুনা] এবং my_array.sample == নমুনা আপনাকে কী বোঝাতে
চাইছে

14
myArray.sample

1 টি এলোমেলো মান প্রদান করবে।

myArray.shuffle.first

1 টি এলোমেলো মান প্রদান করবে।


26
এলোমেলোভাবে অতিরিক্ত হয়।
সুপারলুমিনারি

1
টেকনিক্যালি এই র্যান্ডম পদ্ধতি সঠিক অত্যন্ত stackoverflow.com/a/84747/2047418
ফিলিপ Bartuzi

12

একটি অ্যারের থেকে এলোমেলো আইটেমগুলির র‌্যান্ডম সংখ্যা

def random_items(array)
  array.sample(1 + rand(array.count))
end

সম্ভাব্য ফলাফলের উদাহরণ:

my_array = ["one", "two", "three"]
my_array.sample(1 + rand(my_array.count))

=> ["two", "three"]
=> ["one", "three", "two"]
=> ["two"]

@ ফুইলসন যেকোন ক্রমে অবজেক্টের এলোমেলো সংগ্রহ। বিভিন্ন সংমিশ্রণ পরীক্ষা করতে বা স্টাব ডেটা উত্পন্ন করার জন্যও ভাল
মাইক রাপাদাস

ক্লাস অ্যারে বাড়াতে হবে না কেন? []। মোট_রেন্ডম ওয়ে কুলার হবে। কমোন তার রুবি। এর উদ্দেশ্য!
টিম ক্রেটসচেমার 22'16

এটি কখনই একটি খালি অ্যারে ফিরিয়ে আনবে না। আপনার 1 +আলাদা জায়গায় স্থাপন করা দরকার।
সাওয়া

0
arr = [1,9,5,2,4,9,5,8,7,9,0,8,2,7,5,8,0,2,9]
arr[rand(arr.count)]

এটি অ্যারে থেকে একটি এলোমেলো উপাদান ফিরে আসবে।

যদি আপনি নীচে উল্লিখিত লাইন ব্যবহার করবেন

arr[1+rand(arr.count)]

তারপরে কিছু ক্ষেত্রে এটি 0 বা শূন্য মান প্রদান করবে।

নীচে উল্লিখিত লাইন

rand(number)

সর্বদা 0 থেকে নম্বর -1 এ মানটি ফিরিয়ে দিন।

যদি আমরা ব্যবহার করি

1+rand(number)

তারপরে এটি নম্বর ফিরে আসতে পারে এবং অ্যারে [সংখ্যা] এ কোনও উপাদান থাকে না।


-2
class String

  def black
    return "\e[30m#{self}\e[0m"
  end

  def red
    return "\e[31m#{self}\e[0m"
  end

  def light_green
    return "\e[32m#{self}\e[0m"
  end

  def purple
    return "\e[35m#{self}\e[0m"
  end

  def blue_dark
    return "\e[34m#{self}\e[0m"
  end

  def blue_light
    return "\e[36m#{self}\e[0m"
  end

  def white
    return "\e[37m#{self}\e[0m"
  end


  def randColor
    array_color = [
      "\e[30m#{self}\e[0m",
      "\e[31m#{self}\e[0m",
      "\e[32m#{self}\e[0m",
      "\e[35m#{self}\e[0m",
      "\e[34m#{self}\e[0m",
      "\e[36m#{self}\e[0m",
      "\e[37m#{self}\e[0m" ]

      return array_color[rand(0..array_color.size)]
  end


end
puts "black".black
puts "red".red
puts "light_green".light_green
puts "purple".purple
puts "dark blue".blue_dark
puts "light blue".blue_light
puts "white".white
puts "random color".randColor
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.