PDA

View Full Version : جلوگیری از تکرار اعداد در رندوم



kolibri
یک شنبه 08 شهریور 1394, 20:38 عصر
سلام؛

در ویندوزفرم چطور می تونم از تکرار اعداد جلوگیری کنم؟!
مثلا میان اعداد 1 تا 100 هر عدد انتخاب شد در دور بعد حذف شود.
یعنی اگر 55 انتخاب شد، انتخاب عدد بین 1تا 54 و 56 تا 100 باشد.
در دور بعد اگر 10 انتخاب شد، دور بعد اعداد بین 1تا9، 11تا 54 و 56 تا 100 باشد.
به همین منوال تا آخرین عدد.
با تشکر

pbm_soy
دوشنبه 09 شهریور 1394, 01:36 صبح
با تولید هر عدد جدید آنرا در یک آرایه جستجو کنید اگر وجود نداشت آنرا به آرایه اضافه کنید و سپس عدد بعدی را تولید کنید و دوبار در آرایه جستجو اگر وجود نداشت اضافه کنید اگر وجود داشت دوباره عدد جدید ت،لید کنید والی آخر

rahnema1
دوشنبه 09 شهریور 1394, 18:45 عصر
سلام
ابتدا آرایه مورد نظر را تولید می کنید و سپس به صورت رندوم آرایه را به هم می ریزید که تابع Shuffle که نوشتم کارش همینه
اوردرش هم( O(n می شه

public static class RandomShuffle
{
private static void Swap<T>(this IList<T> input, int ilhs, int irhs)
{
T temp;
temp = input[ilhs];
input[ilhs] = input[irhs];
input[irhs] = temp;
}

public static void Shuffle<T>(this IList<T> input)
{
Random rnd = new Random();
for (int i = input.Count; i > 0; i--) {
input.Swap(rnd.Next(0, i), i - 1);
}
}
}

نحوه استفاده

var arr = new int[]{1,2,3,4};
arr.Shuffle();
foreach (var element in arr) {
MessageBox.Show(element.ToString());
}

pbm_soy
سه شنبه 10 شهریور 1394, 00:50 صبح
عالیه است
الگوریتم دوستمون در پست بالا بهتر و منطقی تر و جالب تر است

shahryari
سه شنبه 10 شهریور 1394, 08:54 صبح
در vb.net تابعی وجود داره به اسم Randomize که تضمین میکنه اعداد تصادفی تکراری نباشن
اما در c# متاسفانه این تابع وجود نداره..
msdn روش زیر رو بجای Randomize پیشنهاد میکنه....


Random r = new Random();
this.label1.Text = r.Next(1, 100).ToString();

rahnema1
سه شنبه 10 شهریور 1394, 09:28 صبح
در vb.net تابعی وجود داره به اسم Randomize که تضمین میکنه اعداد تصادفی تکراری نباشن
اما در c# متاسفانه این تابع وجود نداره..
msdn روش زیر رو بجای Randomize پیشنهاد میکنه....


Random r = new Random();
this.label1.Text = r.Next(1, 100).ToString();

دوست عزیز Randomize اصلا تضمین نمی کنه اعداد تکراری نباشه و کارش دقیقا مثل() Random r = new Random هست

kolibri
سه شنبه 10 شهریور 1394, 10:59 صبح
هدف از ساخت این قسمت این بود که برنامه تصویر پس زمینه تکراری انتخاب نکند، و در صورت پایان یک پیام نمایش دهد.
من این رو نوشتم:

private void changePic() {

ImageBrush myBrush = new ImageBrush();
myBrush.ImageSource =
new BitmapImage(new Uri(url, UriKind.Absolute));
gridon.Background = myBrush;
}

private void changeUrl()
{

Random randumurl = new Random();
//gereften adad beyn 1 ta 25:
int numPic = randumurl.Next(1, 26);


//jostojo baraye tekrari nabodan:
int elementsearch = Array.BinarySearch(j, numPic);




if (elementsearch != -1)
{




changeUrl();


}
else
{
j[numPic] = numPic;
url = "ms-appx:///Assets/Picture/" + numPic + ".jpg";
changePic();
}




}




ولی بهم اخطار گیر کردن در حلقه بی نهایت رو میده!
در جایی که مجدد متد changeUrl رو فراخوانی می کنم(از درون خودش)

rahnema1
سه شنبه 10 شهریور 1394, 11:22 صبح
سلام
ای کاش یه تاپیک چدید ایجاد می کردید
ضمن اینکه برنامه هم چند جا اصلاح کردم لازمه تمرین بیشتر داشته باشید:

private ImageBrush changePic(string url) {
ImageBrush myBrush = new ImageBrush();
myBrush.ImageSource =
new BitmapImage(new Uri(url, UriKind.Absolute));
return myBrush;
}

با استفاده از کلاس RandomShuffle که در بالا گذاشتم می تونید اعداد رندوم غیر تکراری ایجاد کنید

var numPic = Enumerable.Range(1, 26).ToArray();
numPic.Shuffle();
foreach(var pic in numPic){
string url = "ms-appx:///Assets/Picture/" + pic + ".jpg";
gridon.Background = changePic(url);
}

ahmadreza.s
سه شنبه 10 شهریور 1394, 11:28 صبح
سلام به نظرم این قطعه کد ساده تر هست :

ابتدا یه لیست درست میکنیم :
public List<int> mylist = new List<int>();

بعد میایم اینجوری به لیستمون اعداد تصادفی غیر تکراری میدیم :
for(int i = 1; i < 100; i++)
{
Random r = new Random();
int x;
while (true)
{
x=r.Next(1, 100);
if (!mylist.Contains(x))
{
mylist.Add(x);
break;
}
}



----------------------------------

ببخشید دوستان من سوال رو بد متوجه شدم ، مدیر محترم اگه ممکنه اینو پاک کنید

rahnema1
سه شنبه 10 شهریور 1394, 11:33 صبح
سلام به نظرم این قطعه کد ساده تر هست :

ابتدا یه لیست درست میکنیم :
public List<int> mylist = new List<int>();

بعد میایم اینجوری به لیستمون اعداد تصادفی غیر تکراری میدیم :
for(int i = 1; i < 100; i++)
{
Random r = new Random();
int x;
while (true)
{
x=r.Next(1, 100);
if (!mylist.Contains(x))
{
mylist.Add(x);
listBox1.Items.Add(x);
break;
}
}


این روشی که شما استفاده می کنید که دوستمون pbm_soy هم اشاره کرد اوردرش به طور متوسط می شه n به توان 2 در حالی که Shuffle اوردرش تنها n می شه همچنین هزینه Contains هم به اون افزوده می شه!
ضمن اینکه new Random باید خارج از حلقه باشه

kolibri
سه شنبه 10 شهریور 1394, 12:37 عصر
سلام
ای کاش یه تاپیک چدید ایجاد می کردید
ضمن اینکه برنامه هم چند جا اصلاح کردم لازمه تمرین بیشتر داشته باشید:

private ImageBrush changePic(string url) {
ImageBrush myBrush = new ImageBrush();
myBrush.ImageSource =
new BitmapImage(new Uri(url, UriKind.Absolute));
return myBrush;
}

با استفاده از کلاس RandomShuffle که در بالا گذاشتم می تونید اعداد رندوم غیر تکراری ایجاد کنید

var numPic = Enumerable.Range(1, 26).ToArray();
numPic.Shuffle();
foreach(var pic in numPic){
string url = "ms-appx:///Assets/Picture/" + pic + ".jpg";
gridon.Background = changePic(url);
}

ضمن تشکر بابت راهنمایتون حتما تمرینات بیشتری انجام میدم.
اگر امکانش هست این خطوط رو توضیح بفرمایید:
var numPic = Enumerable.Range(1, 26).ToArray();
numPic.Shuffle();

rahnema1
سه شنبه 10 شهریور 1394, 13:01 عصر
ضمن تشکر بابت راهنمایتون حتما تمرینات بیشتری انجام میدم.
اگر امکانش هست این خطوط رو توضیح بفرمایید:
var numPic = Enumerable.Range(1, 26).ToArray();
numPic.Shuffle();


اینکه واضحه
خط اول اعداد 1 تا 26 ایجاد کرده و در آرایه ای به نام numPic ذخیره می کنیم
توی خط دوم محتوای آرایه را به صورت تصادفی به هم می ریزیم یا به اصطلاح بُر می زنیم

kolibri
سه شنبه 10 شهریور 1394, 13:32 عصر
Enumerable برای چیست؟!
یعنی شما اومدید یک آرایه با اعضای بهم ریخته و یکتا ساختید و سپس یکی یکی فراخوانی کردید؟
خیلی عالی، اینجور به مسئله نگاه نکرده بودم!! واقعا نیاز به تمرینات زیادی دارم.

rahnema1
سه شنبه 10 شهریور 1394, 13:35 عصر
Enumerable برای چیست؟!
یعنی شما اومدید یک آرایه با اعضای بهم ریخته و یکتا ساختید و سپس یکی یکی فراخوانی کردید؟
خیلی عالی، اینجور به مسئله نگاه نکرده بودم!! واقعا نیاز به تمرینات زیادی دارم.

آفرین دقیقا همین طوره :لبخند:
Enumerable هم وقتی using System.Linq بذارید قابل استفاده می شه