PDA

View Full Version : سوال: پر کردن آرایه با اعداد تصادفی بدون تکرار در سی شارپ در بازه خاص



nimait70
دوشنبه 01 خرداد 1391, 19:25 عصر
سلام دوستان من یه آرایه دارم و میخوام تو خونه هاش اعداد تصادفی صحیح بین 0 تا 9 رو جای گذاری کنم...میخواستم بپرسم چطوری میتونم این کارو انجام بدم؟
کد زیر رو امتحان کردم ولی کل آرایه یک عدد تکراری میگیره....

for (int i = 0; i < 3; i++)
{
Random rnd = new Random();
int temp = 0;
temp = rnd.Next(0, 9);
page[i] = temp;
}


همچنین از تابع زیر استفاده کردم ولی ارور میده که ارورشو زیر بهتون میگم...
IEnumerable<int> UniqueRandom(int minInclusive, int maxInclusive)
{
List<int> candidates = new List<int>();
for (int i = minInclusive; i <= maxInclusive; i++)
{
candidates.Add(i);
}
Random rnd = new Random();
while (candidates.Count > 1)
{
int index = rnd.Next(candidates.Count);
yield return candidates[index];
candidates.RemoveAt(index);
}
}
به این صورت استفاده کردم ازش :
for (int i = 0; i < 3; i++)
{
page[i] = UniqueRandom(0, 9);
}

ارور هم اینه :

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<int>' to 'int'

نمیدونم چطوری باید به int تبدیلش کنم...
در ضمن اینم بگم که فضای نام :
using System.Collections.Generic;
هم اضافه کردم...مرسی

فرید نجفلو
دوشنبه 01 خرداد 1391, 20:04 عصر
سلام
دوست عزیز از اون تابع به شکل زیر استفاده کنید:
int[] page;
page = UniqueRandom(0, 9).ToArray<int>();

nimait70
دوشنبه 01 خرداد 1391, 20:52 عصر
سلام
دوست عزیز از اون تابع به شکل زیر استفاده کنید:
int[] page;
page = UniqueRandom(0, 9).ToArray<int>();


مرسی دوست عزیز مشکلم حل شد...

nimait70
سه شنبه 02 خرداد 1391, 09:17 صبح
IEnumerable<int> UniqueRandom(int minInclusive, int maxInclusive)
{
List<int> candidates = new List<int>();
for (int i = minInclusive; i <= maxInclusive; i++)
{
candidates.Add(i);
}
Random rnd = new Random();
while (candidates.Count > 1)
{
int index = rnd.Next(candidates.Count);
yield return candidates[index];
candidates.RemoveAt(index);
}
}



دوستان میخواستم یک توضیح خلاصه در مورد خط به خط تابع بالا بهم بدید...یعنی هر خط چه کاری انجام میده؟ مرسی

nimait70
سه شنبه 02 خرداد 1391, 10:59 صبح
دوستان اگه این تابع رو
IEnumerable<int> UniqueRandom(int minInclusive, int maxInclusive)
{
List<int> candidates = new List<int>();
for (int i = minInclusive; i <= maxInclusive; i++)
{
candidates.Add(i);
}
Random rnd = new Random();
while (candidates.Count > 1)
{
int index = rnd.Next(candidates.Count);
yield return candidates[index];
candidates.RemoveAt(index);
}
}


به این صورت به کار ببرم :
int[] page = UniqueRandom(0,9).Take(arraysize).ToArray();
فقط یه آرایه ی 9 خانه ای رو میتونه درست کنه که تموم خونه هاش از 0 تا 9 به صورت رندوم مقدار گرفتند و همشون هم منحصر به فرده...من میخوام آرایم رو مثلا با طول 100، مقدار رندوم از 0 تا 9 بدم که همه ی خونه ها فقط یک عدد نگیرند و کاملا تکراری نباشند...چطوری میتونم این کارو انجام بدم؟

mahyar12
سه شنبه 06 تیر 1391, 15:44 عصر
ببخشید میشه این کد رو از خط اول برای من توضیح بدین
چون من هم نیاز به یک ماتریس تصادفی دارم
خواهش می کنم

returnx
سه شنبه 06 تیر 1391, 18:55 عصر
من برای اینکار دو تا تابع زیر رو نوشتم ، برای اینکه خوانایی کد بیشتر بشه کل کار رو به دو تابع تقسیم کردم براتون میزارم شاید به کارتون بیاد :

void creating_rand_number(int[] i_array, int low, int high)
{
if (high - low < i_array.Length)
{
throw new ApplicationException("Range Of Number Must be More Than The Length Of Array");
}
else
{
bool flag = false;
int rand_number;
Random i_rand = new Random();
for (int counter = 0; counter < i_array.Length; counter++)
{
rand_number = i_rand.Next(low, high);
flag = exist_ch(i_array, rand_number, counter);
while (flag)
{
rand_number = i_rand.Next(low, high);
flag = exist_ch(i_array, rand_number, counter);
}//end while
i_array[counter] = rand_number;
}
}
}//End function


bool exist_ch(int[] i_array, int random_number, int max_index)
{
bool flag = false;
for (int counter = 0; counter < max_index; counter++)
{
if (i_array[counter] == random_number)
returntrue;
}
return flag;
}//End function

tooraj_azizi_1035
سه شنبه 06 تیر 1391, 21:17 عصر
سلام

پر کردن آرایه n خانه ای با اعداد تصادفی 1 تا m به طور یکتا:

Random rnd = new Random();

for(i=0;i<n;i++)
{
k=rnd.Next(1,m+1);
//Must be unique
while(Arr.Contains(k))
k=rnd.Next(1,m+1);

Arr[i]=k;
}

نکته) خروجی Random.Next(minValue,maxValue) یک عدد 32 بیتی بزرگتر یا مساوی minValue و کوچکتر از maxValue است؛ یعنی، محدوده اعداد بازگشتی شامل minValue می شود اما شامل maxValue نمی شود. اگر minValue و maxValue برابر باشند minValue بازگشت داده می شود.

tnbn.ir
پنج شنبه 17 تیر 1395, 09:41 صبح
سلام

پر کردن آرایه n خانه ای با اعداد تصادفی 1 تا m به طور یکتا:

Random rnd = new Random();

for(i=0;i<n;i++)
{
k=rnd.Next(1,m+1);
//Must be unique
while(Arr.Contains(k))
k=rnd.Next(1,m+1);

Arr[i]=k;
}

نکته) خروجی Random.Next(minValue,maxValue) یک عدد 32 بیتی بزرگتر یا مساوی minValue و کوچکتر از maxValue است؛ یعنی، محدوده اعداد بازگشتی شامل minValue می شود اما شامل maxValue نمی شود. اگر minValue و maxValue برابر باشند minValue بازگشت داده می شود.
ممنون الگوریتمتون کوتاه تر از چیزی بود که من طراحی کردم