TGViewer
Software Philosophy Software Philosophy @softwarephilosophy · 3.48K subscribers
Post #2198 2.41K
چگونه به صورت کارآمد یک آرایه را به صورت تصادفی در C# مرتب کنیم؟

🔸رندم کردن آرایه با استفاده از Linq
ابزار جست و جوی LINQ یکی از قدرتمندترین امکاناتی است که در C# در اختیار ما قرار دارد. این ابزار روش‌های مختلف کنترل داده‌ها را فراهم می‌کند.
معمولاً از LINQ برای پرس و جو یا فیلتر کردن مجموعه داده‌ها استفاده می‌کنیم، اما می‌توانیم برای تصادفی سازی نیز از LINQ استفاده کنیم. در این شیوه از ()OrderBy برای مرتب سازی داده‌ها براساس یک کلید مشخص استفاده می‌شود. برای این کار می‌توانیم از روش مرتب کردن به وسیله GUID و روش مرتب کردن به وسیله کلاس Random استفاده کنیم.

🔻رندم کردن به وسیله GUID
با ترتیب دادن براساس ()Guid.NewGuid، که برای هر عنصر در آرایه یک شناسه منحصر به فرد ایجاد می‌کند، عناصر آرایه به صورت تصادفی با هم چیده می‌شوند.

array.OrderBy(x => Guid.NewGuid()).ToArray();

🔻رندم کردن آرایه با یک کلاس رندم
این بار داده‌ها را بر اساس اعداد تصادفی تولید شده با استفاده از متد Next از Random.Shared مرتب می کنیم.

array.OrderBy(x => Random.Shared.Next()).ToArray();

🔸رندم کردن آرایه در #C با استفاده از الگوریتم Fisher-Yates

    int count = array.Length;
while (count > 1)
{
int i = Random.Shared.Next(count--);
(array[i], array[count]) = (array[count], array[i]);
}

در هر تکرار حلقه while، یک عدد تصادفی تولید می‌شود و عنصر مربوط به ایندکس عدد تولید شده تصادفی در آرایه با عنصر اشاره شده توسط متغیر count با استفاده از Tuple جابجا می‌شود. این کار تا زمانی ادامه پیدا می‌کند که count برابر ۱ شود. در نهایت، آرایه تغییر یافته را برمی‌گردانیم.
این روش به صورت مستقیم روی آرایه ورودی عمل می‌کند و آن را برمی‌گرداند، در حالی که روش‌های OrderBy یک کپی از آرایه را برمی‌گردانند.

🔻نسخه دیگر این الگوریتم به صورت زیر پیاده سازی می‌شود.

    int count = array.Length;
var arrayCopy = new int[count];
Array.Copy(array, arrayCopy, count);
while (count > 1)
{
int i = Random.Shared.Next(count--);
(arrayCopy[i], arrayCopy[count]) = (arrayCopy[count], arrayCopy[i]);
}
return arrayCopy;

این روش تقریباً شبیه به روش قبلی است با این استثنا که از روش Array.Copy() برای کپی آرایه ورودی استفاده می‌کنیم. در بخش دیگری از متد، با متغیر arrayCopy کار می‌کنیم و پس از پایان کار آن را برمی‌گردانیم.

💠 ملاحظات پرفورمنسی هنگام تصادفی سازی یک آرایه در C#
🔻روش الگوریتم Fisher-Yates تا حد زیادی بهترین عملکرد را دارد و در رتبه اول قرار دارد و تقریباً هیچ تخصیص حافظه‌ای ندارد.
🔻نسخه اصلاح شده الگوریتم در رتبه دوم قرار دارد و به دلیل کپی کردن آرایه ورودی، تخصیص حافظه بیشتری نسبت به نسخه اصلی دارد.
🔻سپس، روش استفاده از Linq و کلاس Random با زمان اجرای بالاتر و تخصیص حافظه قابل توجه بالاتر نسبت به دو روش قبل - در رتبه سوم قرار دارد.
🔻و در نهایت، روش استفاده از Linq و GUID در میان چهار روش، در رتبه آخر قرار دارد و همچنین بالاترین تخصیص حافظه را دارد.

🔗 نسخه کامل این مقاله را ‌می‌توانید در اینجا مطالعه کنید.

🔗 لینک مقاله در ویرگول

⁉️ برای بحث و تبادل نظر فنی در مورد این پست، نظرات خود را با ما در قسمت کامنت‌ها به اشتراک بگذارید.

#نگار_قاسمی (لینکدین)

کانال تلگرام:
@SoftwarePhilosophy

______
Code Maze How to Efficiently Randomize an Array in C# - Code Maze In this article, we'll explore several ways to randomize an array in C#. We'll see the most efficient way of doing this.
  • 👍 7
  • 🔥 3
  • ❤ 2
More from @softwarephilosophy
  1. Sep 27, 2026نگو JEV بگو System One! دنیل کانمن (Daniel Kahneman) توی کتاب معروفش «تفکر، سریع و کند» (T…
  2. Sep 23, 2026بازنویسی کل GitHub Copilot Runtime با Rust 🔶 حدود ۱۲۰،۰۰۰ دلار هزینه توکن و سه هفته وقت ی…
  3. Sep 15, 2026ورک‌شاپ «AI Agents in C# (MAF)» در این ورک‌شاپ به بررسی امکانات جدید برنامه‌نویسی با کتابخ…
  4. Sep 12, 2026کد مدریت شده (Managed Code) در دات‌نت یعنی چی؟ ▫️به زبان ساده: کد مدریت شده (Managed Code)…
  5. Sep 5, 2026آشنایی با Attributeها در سی‌شارپ در سی شارپ، Attributeها برای اضافه کردن metadata یا اطلاع…
  6. Aug 25, 2026اگر در دات نت Agent، MCP Server یا ابزارهای مبتنی بر هوش مصنوعی توسعه میدهی، این پروژه میت…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →