.NET সহ একটি অ্যারে এলোমেলো করার সর্বোত্তম উপায়


141

.NET দিয়ে স্ট্রিংগুলির একটি অ্যারে এলোমেলো করার সর্বোত্তম উপায় কী? আমার অ্যারেতে প্রায় 500 টি স্ট্রিং রয়েছে এবং আমি Arrayএকই স্ট্রিং দিয়ে তবে একটি এলোমেলো ক্রমে একটি নতুন তৈরি করতে চাই ।

আপনার উত্তরে একটি সি # উদাহরণ অন্তর্ভুক্ত করুন।


1
এটির জন্য একটি অদ্ভুত তবে সহজ সমাধান - স্ট্যাকওভারফ্লো . com / a / 4262134 / 1298685
আয়ান ক্যাম্পবেল

1
মেডেলিয়নর্যান্ডম নুগেট প্যাকেজটি ব্যবহার করে , এটি ঠিক myArray.Shuffled().ToArray()(বা myArray.Shuffle()আপনি যদি বর্তমান অ্যারেটি পরিবর্তন করতে চান)
চেসমেডালিয়ন

উত্তর:


171

আপনি .NET 3.5 এ থাকলে আপনি নিম্নোক্ত শীতলতা (VB.NET, C # নয়, তবে ধারণাটি পরিষ্কার হওয়া উচিত) ব্যবহার করতে পারেন:

Random rnd=new Random();
string[] MyRandomArray = MyArray.OrderBy(x => rnd.Next()).ToArray();    

সম্পাদনা করুন: ঠিক আছে এবং এখানে সম্পর্কিত VB.NET কোড রয়েছে:

Dim rnd As New System.Random
Dim MyRandomArray = MyArray.OrderBy(Function() rnd.Next()).ToArray()

দ্বিতীয় সম্পাদনা, এমন মন্তব্যের জবাবে যে সিস্টেম.রেন্ডম "থ্রেডসেফ নয়" এবং সময় ভিত্তিক ক্রম ফিরে আসার কারণে "কেবল খেলনা অ্যাপগুলির জন্য উপযুক্ত": আমার উদাহরণ হিসাবে ব্যবহৃত হয়েছে, র্যান্ডম () নিখুঁতভাবে থ্রেড-নিরাপদ, যদি না আপনি যে রুটিনটিতে অ্যারেটিকে এলোমেলো করে পুনরায় প্রবেশের অনুমতি দিচ্ছেন, সেক্ষেত্রে আপনার ডেটাটিকে lock (MyRandomArray)দূষিত না করার জন্য আপনার যেমন কিছু প্রয়োজন হবে যা এটিও সুরক্ষা দেবে rnd

এছাড়াও, এটি ভালভাবে বোঝা উচিত যে সিস্টেম.র্যান্ডম এন্ট্রপির উত্স হিসাবে খুব শক্তিশালী নয়। এমএসডিএন ডকুমেন্টেশনে উল্লিখিত হিসাবে , আপনি System.Security.Cryptography.RandomNumberGeneratorযদি সুরক্ষা-সম্পর্কিত কিছু করছেন তবে আপনার থেকে নেওয়া কিছু ব্যবহার করা উচিত । উদাহরণ স্বরূপ:

using System.Security.Cryptography;

...

RNGCryptoServiceProvider rnd = new RNGCryptoServiceProvider();
string[] MyRandomArray = MyArray.OrderBy(x => GetNextInt32(rnd)).ToArray();

...

static int GetNextInt32(RNGCryptoServiceProvider rnd)
    {
        byte[] randomInt = new byte[4];
        rnd.GetBytes(randomInt);
        return Convert.ToInt32(randomInt[0]);
    }

দুটি নোট: 1) সিস্টেম.র্যান্ডম থ্রেড-নিরাপদ নয় (আপনাকে সতর্ক করা হয়েছে) এবং 2) সিস্টেম.র্যান্ডম সময় ভিত্তিক, তাই আপনি যদি এই কোডটি একটি ভারী সমবর্তী সিস্টেমের মধ্যে ব্যবহার করেন তবে দুটি অনুরোধ পাওয়ার পক্ষে এটি সম্ভব একই মান (অর্থাত
ওয়েব্যাপগুলিতে

2
কেবলমাত্র উপরের বিষয়টিকে স্পষ্ট করার জন্য, সিস্টেম.র্যান্ডম বর্তমান সময়টি ব্যবহার করে নিজেই বীজ বজায় রাখবে, সুতরাং একই সাথে দু'টি দৃষ্টান্ত তৈরি করা একই "এলোমেলো" ক্রম তৈরি করবে
.. সিস্টেমে।

8
এছাড়াও এই অ্যালগরিদমটি হ'ল (এন লগ এন) এবং কিসোর্ট অ্যালগরিদম দ্বারা পক্ষপাতযুক্ত। ও (এন) নিরপেক্ষ সমাধানের জন্য আমার উত্তর দেখুন।
ম্যাট হাওয়েলস

9
যদি OrderByঅভ্যন্তরীণভাবে বাছাই কীগুলি না করে, তবে এতে অর্ডার করা তুলনাগুলির ট্রানজিটিভ সম্পত্তি লঙ্ঘন করার সমস্যাও রয়েছে। যদি কখনও কোনও ডিবাগ মোড যাচাই থাকে যা OrderByসঠিক ফলাফল দেয় তবে তত্ত্বীয় ক্ষেত্রে এটি ব্যতিক্রম ছুঁড়ে দিতে পারে।
স্যাম হারওয়েল


205

নিম্নলিখিত বাস্তবায়নটি ফিশার-ইয়েটস অ্যালগোরিদম একেএমএ নথ শফল ব্যবহার করে। এটি ও (এন) সময়ে সঞ্চালিত হয় এবং স্থানটি পরিবর্তিত হয়, সুতরাং কোডের আরও লাইন হলেও এটি 'এলোমেলোভাবে সাজানো' কৌশলটির চেয়ে আরও ভাল পারফর্ম করে। তুলনামূলক পারফরম্যান্স পরিমাপের জন্য এখানে দেখুন । আমি সিস্টেম.র্যান্ডম ব্যবহার করেছি, যা অ-ক্রিপ্টোগ্রাফিক উদ্দেশ্যে উপযুক্ত *

static class RandomExtensions
{
    public static void Shuffle<T> (this Random rng, T[] array)
    {
        int n = array.Length;
        while (n > 1) 
        {
            int k = rng.Next(n--);
            T temp = array[n];
            array[n] = array[k];
            array[k] = temp;
        }
    }
}

ব্যবহার:

var array = new int[] {1, 2, 3, 4};
var rng = new Random();
rng.Shuffle(array);
rng.Shuffle(array); // different order from first call to Shuffle

* দীর্ঘতর অ্যারেগুলির জন্য, (অতি বৃহত) সংখ্যার ক্রম সমমানের সম্ভাবনা তৈরি করার জন্য পর্যাপ্ত এনট্রপি তৈরির জন্য প্রতিটি সোয়াপের জন্য বহু পুনরাবৃত্তির মাধ্যমে সিউডো-র্যান্ডম নম্বর জেনারেটর (পিআরএনজি) চালানো দরকার। 500-এলিমেন্ট অ্যারের জন্য কেবল 500 এর খুব সামান্য ভগ্নাংশ! পিআরএনজি ব্যবহার করে অনুমতি প্রাপ্তি সম্ভব হবে। তবুও, ফিশার-ইয়েটস অ্যালগরিদম পক্ষপাতহীন এবং সুতরাং আপনার ব্যবহার করা আরএনজি হিসাবে এই রদবদলটি ভাল হবে।


1
প্যারামিটারগুলি পরিবর্তন করে ব্যবহারটি তৈরি করা কি ভাল হবে না array.Shuffle(new Random());..?
কেন কিন

4.0 -> (অ্যারে [এন], অ্যারে [কে]) = (অ্যারে [কে], অ্যারে [এন]) হিসাবে টিপলস ব্যবহার করে আপনি অদলবদলকে সরল করতে পারেন;
ডায়নামিকেল

@ কেন কিন: না, এটি খারাপ হবে। কারণটি হ'ল new Random()বর্তমান সিস্টেম সময়ের উপর ভিত্তি করে একটি বীজ মান দিয়ে আরম্ভ করা হয় যা প্রতি প্রতি 16 ডলারে আপডেট হয়।
ম্যাট হাওয়েলস

এই বনামের তালিকার অপসারণ সমাধানের কয়েকটি দ্রুত পরীক্ষায়, 999 উপাদানগুলিতে একটি সামান্য পার্থক্য রয়েছে। পার্থক্যটি কঠোরভাবে 99999 এলোমেলোভাবে অন্তর্নিহিত হয়, এর সমাধানটি 3 এমএসে এবং অন্যটি 1810ms এ হয়।
12:54 এ গ্ল্যামড্রিং

18

আপনি একটি বদলানো অ্যালগরিদম খুঁজছেন, তাই না?

ঠিক আছে, এটি করার দুটি উপায় রয়েছে: চতুর-তবে-লোকেরা-সবসময়-মনে হয়-ভুল-বোঝা-করা-এবং-এটি-এটি-ভুল-তাই-সম্ভবত-তার-না-তেমন-চতুর-পরে- উপায়, এবং বোবা হিসাবে-শিলা-তবে-কে-যত্ন করে-কারণ এটি কাজ করে।

বোবা উপায়

  • আপনার প্রথম অ্যারের সদৃশ তৈরি করুন, তবে প্রতিটি স্ট্রিং এলোমেলো সংখ্যার সাথে ট্যাগ করুন।
  • এলোমেলো সংখ্যার সাথে সদৃশ করে সদৃশ অ্যারে সাজান।

এই অ্যালগরিদম ভাল কাজ করে তবে নিশ্চিত হয়ে নিন যে আপনার এলোমেলো সংখ্যা জেনারেটর একই সংখ্যার সাথে দুটি স্ট্রিং ট্যাগ করার সম্ভাবনা নেই। তথাকথিত জন্মদিনের প্যারাডক্সের কারণে এটি আপনার প্রত্যাশার চেয়ে প্রায়শই ঘটে। এর সময়ের জটিলতা হ'ল ও ( এন লগ এন )।

চতুর উপায়

আমি এটি পুনরাবৃত্তির অ্যালগরিদম হিসাবে বর্ণনা করব:

আকার এন এর অ্যারে পরিবর্তন করতে (সূচি সূচকগুলি [0 .. এন -1]):

যদি এন = 0
  • কিছু করনা
যদি এন > 0
  • (পুনরাবৃত্তির পদক্ষেপ) প্রথম এন এলোমেলো অ্যারের -1 উপাদানগুলি সাফ করুন
  • পরিসরে একটি এলোমেলো সূচী, এক্স , বেছে নিন [0 .. n -1]
  • সূচক x- এ উপাদানটির সাথে সূচক এন -1 এ উপাদানটি অদলবদল করুন

পুনরাবৃত্তির সমতুল্য হ'ল অ্যারের মধ্য দিয়ে একটি পুনরাবৃত্তকারী হাঁটা, এলোমেলো উপাদানগুলির সাথে অদলবদল করার সাথে সাথে অদলবদল করা, তবে লক্ষ্য করুন যে আপনি কোনও এলিমেন্টের পরে অদলবদল করতে পারবেন না নির্দেশিত বিন্দুর । এটি একটি খুব সাধারণ ভুল এবং এটি একটি পক্ষপাতদুষ্ট পরিবর্তন ঘটায়।

সময়ের জটিলতা হ'ল ও ( এন )।


8

এই অ্যালগরিদম সহজ তবে দক্ষ নয়, ও (এন 2 )। সমস্ত "অর্ডার বাই" অ্যালগরিদমগুলি সাধারণত ও (এন লগ এন) হয়। এটি সম্ভবত কয়েক হাজার উপাদানগুলির নীচে কোনও পার্থক্য তৈরি করে না তবে এটি বৃহত তালিকার জন্য।

var stringlist = ... // add your values to stringlist

var r = new Random();

var res = new List<string>(stringlist.Count);

while (stringlist.Count >0)
{
   var i = r.Next(stringlist.Count);
   res.Add(stringlist[i]);
   stringlist.RemoveAt(i);
}

এটি ও (এন 2 ) কেন সূক্ষ্ম হওয়ার কারণ: আপনি শেষ থেকে ক্রম সরিয়ে না নিলে তালিকা.আরমোভ্যাট () একটি ও (এন) অপারেশন।


2
এটি নথ শ্যাফলের মতো একই প্রভাব ফেলে তবে এটি ততটা দক্ষ নয়, কারণ এটিতে একটি তালিকা ডিপোপুলেটিং এবং অন্যটি পুনরায় প্রচারের অন্তর্ভুক্ত। আইটেমগুলি স্থানে অদলবদল করা আরও ভাল সমাধান হবে।
নিক জনসন

1
আমি এই মার্জিত এবং সহজে বোধগম্য এবং 500 টি স্ট্রিং এ এটি কিছুটা পার্থক্য করে না ...
Sklivvz

4

আপনি ম্যাট হাওলসের বাইরেও একটি এক্সটেনশন পদ্ধতি তৈরি করতে পারেন। উদাহরণ।

   namespace System
    {
        public static class MSSystemExtenstions
        {
            private static Random rng = new Random();
            public static void Shuffle<T>(this T[] array)
            {
                rng = new Random();
                int n = array.Length;
                while (n > 1)
                {
                    int k = rng.Next(n);
                    n--;
                    T temp = array[n];
                    array[n] = array[k];
                    array[k] = temp;
                }
            }
        }
    }

তারপরে আপনি এটির মতো এটি ব্যবহার করতে পারেন:

        string[] names = new string[] {
                "Aaron Moline1", 
                "Aaron Moline2", 
                "Aaron Moline3", 
                "Aaron Moline4", 
                "Aaron Moline5", 
                "Aaron Moline6", 
                "Aaron Moline7", 
                "Aaron Moline8", 
                "Aaron Moline9", 
            };
        names.Shuffle<string>();

আপনি কেন প্রতিটি কলটি পদ্ধতিতে পুনরায় তৈরি করছেন ... আপনি এটি ক্লাস স্তরে ঘোষণা করেছেন তবে স্থানীয় হিসাবে ব্যবহার করেন ...
ইয়ারন

1

অ্যারে এলোমেলো করা তীব্র হয় কারণ আপনাকে একগুচ্ছ স্ট্রিংয়ের বদলে যেতে হয়। শুধু এলোমেলোভাবে অ্যারে থেকে পড়া হয় না কেন? সবচেয়ে খারাপ ক্ষেত্রে আপনি একটি getNextString () দিয়ে একটি মোড়ক ক্লাস তৈরি করতে পারে। আপনার যদি সত্যিই এলোমেলো অ্যারে তৈরি করার দরকার হয় তবে আপনি এর মতো কিছু করতে পারেন

for i = 0 -> i= array.length * 5
   swap two strings in random places

* 5 নির্বিচারে হয়।


অ্যারে থেকে একটি এলোমেলো পড়া সম্ভবত কিছু আইটেমকে একাধিকবার আঘাত করবে এবং অন্যকে মিস করবে!
রায় হেইস

বদলানো অ্যালগরিদম ভেঙে গেছে। আপনার এলোমেলো পক্ষপাতহীন হওয়ার আগে আপনাকে অবশ্যই আপনার নির্বিচারে 5 তৈরি করতে হবে।
পিটারো

(পূর্ণসংখ্যা) সূচকের একটি অ্যারে তৈরি করুন। সূচকগুলি সাফ করুন। কেবল এলোমেলো ক্রমে সূচিগুলি ব্যবহার করুন। কোনও সদৃশ, মেমরির স্ট্রিং রেফারেন্সগুলির চারপাশে কোনও পরিবর্তন নয় (যা প্রতিটি প্রত্যেকে ইন্টার্নিং করতে পারে এবং কী না)।
ক্রিস্টোফার

1

আমার মাথার উপরের দিক থেকে কেবল চিন্তা করেই আপনি এটি করতে পারেন:

public string[] Randomize(string[] input)
{
  List<string> inputList = input.ToList();
  string[] output = new string[input.Length];
  Random randomizer = new Random();
  int i = 0;

  while (inputList.Count > 0)
  {
    int index = r.Next(inputList.Count);
    output[i++] = inputList[index];
    inputList.RemoveAt(index);
  }

  return (output);
}

0

এলোমেলো ফ্লোটস বা একই দৈর্ঘ্যের ইনট তৈরি করুন। সেই অ্যারে বাছাই করুন, এবং আপনার টার্গেট অ্যারেতে সম্পর্কিত স্ব্যাপগুলি করুন।

এটি সত্যিকারের স্বতন্ত্র ধরণের ফলন দেয়।


0
Random r = new Random();
List<string> list = new List(originalArray);
List<string> randomStrings = new List();

while(list.Count > 0)
{
int i = r.Random(list.Count);
randomStrings.Add(list[i]);
list.RemoveAt(i);
}

0

জ্যাকো, আপনার সমাধানটি একটি কাস্টম আইকম্পারার নিরাপদ নয়। বাছাই রুটিনগুলি সঠিকভাবে কাজ করার জন্য তুলনামূলকটিকে বেশ কয়েকটি প্রয়োজনীয়তার সাথে মানিয়ে নিতে প্রয়োজন। এর মধ্যে প্রথমটি হল ধারাবাহিকতা। যদি তুলনাকারীকে একই জুটির অবজেক্টগুলিতে ডাকা হয় তবে অবশ্যই সর্বদা একই ফলাফলটি ফিরে আসতে হবে। (তুলনাটিও ট্রানজিটিভ হতে হবে)।

এই প্রয়োজনীয়তাগুলি পূরণে ব্যর্থতা বাছাইকরণের রুটিনে অসীম লুপের সম্ভাবনা সহ অনেকগুলি সমস্যা তৈরি করতে পারে।

প্রতিটি এন্ট্রির সাথে একটি এলোমেলো সংখ্যাসূচক মানকে সংযুক্ত করে এবং সেই মান অনুসারে বাছাই করা সমাধানগুলি সম্পর্কিত, এগুলি আউটপুটে অন্তর্নিহিত পক্ষপাতের দিকে পরিচালিত হয় কারণ যে কোনও সময় দুটি এন্ট্রি একই সংখ্যাসূচক মান নির্ধারিত হওয়ার পরে আউটপুটটির এলোমেলোতা আপস করা হবে will (একটি "স্থিতিশীল" সাজানোর রুটিনে, ইনপুটটিতে প্রথমে যে কোনওটি আউটপুটে প্রথম হবে ray অ্যারে Sসোর্টটি স্থিতিশীল হতে পারে না, তবে কুইকসোর্ট অ্যালগরিদমের দ্বারা বিভাজনের ভিত্তিতে একটি পক্ষপাত রয়েছে))।

আপনার কোন স্তরের এলোমেলো প্রয়োজন তা নিয়ে আপনার কিছু ভাবনা করা দরকার। আপনি যদি এমন কোনও জুজু সাইট চালাচ্ছেন যেখানে নির্ধারিত আক্রমণকারীর হাত থেকে রক্ষা পেতে আপনার ক্রিপ্টোগ্রাফিক স্তরের র্যান্ডমনেস প্রয়োজন হয় আপনার কাছে এমন কোনও ব্যক্তির থেকে খুব আলাদা প্রয়োজনীয়তা আছে যা কেবল গানের প্লেলিস্টকে এলোমেলো করতে চায়।

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


0

এই পোস্টটি ইতিমধ্যে বেশ উত্তমরূপে জবাব দেওয়া হয়েছে - দ্রুত এবং নিরপেক্ষ ফলাফলের জন্য ফিশার-ইয়েটস সাফল্যের একটি ডার্সটেনফিল্ড প্রয়োগ ব্যবহার করুন। এমনকি কিছু বাস্তবায়ন পোস্ট করা হয়েছে, যদিও আমি লক্ষ করি কিছু আসলে ভুল।

আমি এই কৌশলটি ব্যবহার করে সম্পূর্ণ এবং আংশিক রদবদলগুলি বাস্তবায়নের জন্য কিছুক্ষণ আগে পোস্ট করেছি এবং (আপনার এই প্রয়োগটি নিরপেক্ষ কিনা তা যাচাই করতে হবে এই দ্বিতীয় লিঙ্কটিও আমি সেখানে মূল্য যুক্ত করার আশায় রয়েছি) , যে কোনও শ্যাফেল অ্যালগরিদম পরীক্ষা করতে ব্যবহার করা যেতে পারে। আপনি দ্বিতীয় পোস্টের শেষে দেখতে পারেন এলোমেলো সংখ্যা নির্বাচন করতে পারে এমন একটি সাধারণ ভুলের প্রভাব।


1
আপনার লিঙ্কগুলি এখনও ভাঙা হয়েছে: /
ওয়াই হা লি

0

ঠিক আছে, এটি আমার পক্ষ থেকে স্পষ্টতই একটি গোঁফ (ক্ষমা চাই ...) তবে আমি প্রায়শই একটি সাধারণ এবং ক্রিপ্টোগ্রাফিকভাবে শক্তিশালী পদ্ধতি ব্যবহার করি।

public static class EnumerableExtensions
{
    static readonly RNGCryptoServiceProvider RngCryptoServiceProvider = new RNGCryptoServiceProvider();
    public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> enumerable)
    {
        var randomIntegerBuffer = new byte[4];
        Func<int> rand = () =>
                             {
                                 RngCryptoServiceProvider.GetBytes(randomIntegerBuffer);
                                 return BitConverter.ToInt32(randomIntegerBuffer, 0);
                             };
        return from item in enumerable
               let rec = new {item, rnd = rand()}
               orderby rec.rnd
               select rec.item;
    }
}

শ্যাফেল () হ'ল যে কোনও আইনুনিউরেবলের এক্সটেনশন তাই বলা যাক, তালিকার এলোমেলো ক্রমে 0 থেকে 1000 পর্যন্ত সংখ্যাগুলি দিয়ে সম্পন্ন করা যেতে পারে

Enumerable.Range(0,1000).Shuffle().ToList()

এই পদ্ধতিটি যখন বাছাইয়ের ক্ষেত্রে আসে তখন কোনও আশ্চর্যও দেয় না, যেহেতু ক্রমান্বিত মানটি প্রতিটি উপাদান অনুসারে একবারে উত্পন্ন হয় এবং স্মরণ করা হয়।


0

আপনার জটিল অ্যালগরিদমের দরকার নেই।

কেবল একটি সাধারণ লাইন:

Random random = new Random();
array.ToList().Sort((x, y) => random.Next(-1, 1)).ToArray();

মনে রাখবেন আমরা রূপান্তর করতে হবে Arrayএকটি করতে List, প্রথম আপনি ব্যবহার করবেন নাList প্রথম স্থানে।

এছাড়াও, মনে রাখবেন যে এটি খুব বড় অ্যারেগুলির পক্ষে দক্ষ নয়! অন্যথায় এটি পরিষ্কার এবং সাধারণ।


ত্রুটি: অপারেটর '। 'অকার্যকর' ধরণের
অপেরেন্ডে

0

এটি এখানে সরবরাহিত উদাহরণের ভিত্তিতে একটি সম্পূর্ণ কার্যকারী কনসোল সমাধান :

class Program
{
    static string[] words1 = new string[] { "brown", "jumped", "the", "fox", "quick" };

    static void Main()
    {
        var result = Shuffle(words1);
        foreach (var i in result)
        {
            Console.Write(i + " ");
        }
        Console.ReadKey();
    }

   static string[] Shuffle(string[] wordArray) {
        Random random = new Random();
        for (int i = wordArray.Length - 1; i > 0; i--)
        {
            int swapIndex = random.Next(i + 1);
            string temp = wordArray[i];
            wordArray[i] = wordArray[swapIndex];
            wordArray[swapIndex] = temp;
        }
        return wordArray;
    }         
}

0
        int[] numbers = {0,1,2,3,4,5,6,7,8,9};
        List<int> numList = new List<int>();
        numList.AddRange(numbers);

        Console.WriteLine("Original Order");
        for (int i = 0; i < numList.Count; i++)
        {
            Console.Write(String.Format("{0} ",numList[i]));
        }

        Random random = new Random();
        Console.WriteLine("\n\nRandom Order");
        for (int i = 0; i < numList.Capacity; i++)
        {
            int randomIndex = random.Next(numList.Count);
            Console.Write(String.Format("{0} ", numList[randomIndex]));
            numList.RemoveAt(randomIndex);
        }
        Console.ReadLine();

-1

ওলিনকিউ ব্যবহারের জন্য এখানে একটি সহজ উপায়:

// Input array
List<String> lst = new List<string>();
for (int i = 0; i < 500; i += 1) lst.Add(i.ToString());

// Output array
List<String> lstRandom = new List<string>();

// Randomize
Random rnd = new Random();
lstRandom.AddRange(from s in lst orderby rnd.Next(100) select s);

-2
private ArrayList ShuffleArrayList(ArrayList source)
{
    ArrayList sortedList = new ArrayList();
    Random generator = new Random();

    while (source.Count > 0)
    {
        int position = generator.Next(source.Count);
        sortedList.Add(source[position]);
        source.RemoveAt(position);
    }  
    return sortedList;
}

আমার কাছে এটি মনে হয় আপনি দ্বিতীয় অ্যারে ঘোষণা করে কোনও অ্যারে বদলানোর পরিবর্তে দক্ষতা এবং পাঠযোগ্যতা উভয়ই বাড়িয়ে তুলতে পারেন, আপনি আরও ভালভাবে একটি তালিকাতে sortedList = source.ToList().OrderBy(x => generator.Next()).ToArray();
রদবদল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.