PDA

View Full Version : سوال: استفاده از تابع random به همراه timer



mahan0o0
چهارشنبه 31 تیر 1394, 22:45 عصر
سلام
من یک برنامه دارم مینویسم که کار قرعه کشی رو انجام بده یک باتن گذاشتم که با کلیک اعداد داخل textbox با یک تایمر که گذاشتم تا 100 بار عوض میشه مشکل اینه که بار اول که روی باتن کلیک کی کنم اعداد داخل textbox 100 بار عوض میشه ولی دفعات بعد به ترتیب با هر کلیک رو باتن اعداد کمتر عوض میشن مثلا 50 بار 20 بار 10 بار به صورتی که با کلیک 10 با یازدهم دیگه تغییر اعداد توی textbox صورت نمیگیره و فقط یک عدد راندوم توی textbox نشون داده میشه. کدم رو میزارم ببینید مشکل کار کحاست اگه راه حلی به نظرتون رسید ممنون میشم راهنمایی کنید. آزمون و خطا هم زیاد کردم نتیجه نداد اگه امتحان کنید واستون دیدید جواب داد بگید خیلی خیلی ممنون می شم

int con=0;
private void NumbersMoving()
{
Random ra = new Random();
int randm = ra.Next(100, 200);
txtRandomShow.Text = randm.ToString();
}
private void btnrandomnumber_Click(object sender, EventArgs e)
{
con = 0;
timerNumAnimation.Start();
timerNumAnimation.Tick += new EventHandler(timerRandomNumberChange_Tick);

}
private void timerRandomNumberChange_Tick(object sender, EventArgs e)
{
if (con < 100)
{
NumbersMoving();
con++;
}
else
{
timerRandomNumberChange.Stop();
}
}

Amir4317
پنج شنبه 01 مرداد 1394, 00:20 صبح
سلام!

شما در هر بار کلیک رخداد رو بصورت چندباره به تایمرتون اضافه میکنید
کافیه در فرم لود یا بعد از مقدار دهی اولیه فرم کدی رخداد دهی تایمر رو بگذارید.

فعلا دسترسی ب ویژ<ال استودیو ندارم خودتون امتحان کنید. :متفکر:

mahan0o0
پنج شنبه 01 مرداد 1394, 06:51 صبح
سلام!

شما در هر بار کلیک رخداد رو بصورت چندباره به تایمرتون اضافه میکنید
کافیه در فرم لود یا بعد از مقدار دهی اولیه فرم کدی رخداد دهی تایمر رو بگذارید.

فعلا دسترسی ب ویژ<ال استودیو ندارم خودتون امتحان کنید. :متفکر:

ببخشید متوجه نشدم. الان مشکل اینه که با هر بار کلیک تعداد دفعات تغییر اعداد توی textbox کم میشه و اگه count رو روی 1000 بزارم تا 20-30 بار کلیک هم احساس نمیشه و تازه از اون به بعد متوجه میشی. حالا باید چکار کنم که این مشکل برطرف شه یعنی چه یک بار روی باتن کلیک کنم چه 100 بار اعداد همون 100 بار داخل textbox عوض بشن

ناامید
پنج شنبه 01 مرداد 1394, 19:11 عصر
-------------

ناامید
پنج شنبه 01 مرداد 1394, 19:13 عصر
سلام.

سلام.
شما میتونید از HashSet استفاده کنید و 100 مقدار متفاوت داشته باشید.
HashSet داده های تکراری رو قبول نمیکنه امتحان کنید:

private void button1_Click(object sender, EventArgs e)
{
HashSet<int> hashset = new HashSet<int>();
hashset.Add(1);
hashset.Add(1);
hashset.Add(2);
hashset.Add(2);
hashset.Add(3);
string hashsetItems = "";
foreach (var item in hashset)
{
hashsetItems += item.ToString() + ",";
}
MessageBox.Show(hashsetItems);
}



کد اصلی:


private void Form1_Load(object sender, EventArgs e)
{
timerNumAnimation.Tick += new EventHandler(timerRandomNumberChange);
}

private int count = 0;
private List<int> randomNumbers = new List<int>();

private void CreateRandomNumber()
{
Random rand = new Random();
HashSet<int> numbers = new HashSet<int>();
while (numbers.Count < 100)
{
numbers.Add(rand.Next(100, 200));
}
randomNumbers = numbers.ToList();
}

private void btnrandomnumber_Click(object sender, EventArgs e)
{
count = 0;
CreateRandomNumber();
timerNumAnimation.Start();
}

private void timerRandomNumberChange(object sender, EventArgs e)
{
if (count < 100)
txtRandomShow.Text = randomNumbers[count++].ToString();
else
count = 0;
}

mahan0o0
یک شنبه 04 مرداد 1394, 06:54 صبح
سلام.

سلام.
شما میتونید از HashSet استفاده کنید و 100 مقدار متفاوت داشته باشید.
HashSet داده های تکراری رو قبول نمیکنه امتحان کنید:

private void button1_Click(object sender, EventArgs e)
{
HashSet<int> hashset = new HashSet<int>();
hashset.Add(1);
hashset.Add(1);
hashset.Add(2);
hashset.Add(2);
hashset.Add(3);
string hashsetItems = "";
foreach (var item in hashset)
{
hashsetItems += item.ToString() + ",";
}
MessageBox.Show(hashsetItems);
}



کد اصلی:


private void Form1_Load(object sender, EventArgs e)
{
timerNumAnimation.Tick += new EventHandler(timerRandomNumberChange);
}

private int count = 0;
private List<int> randomNumbers = new List<int>();

private void CreateRandomNumber()
{
Random rand = new Random();
HashSet<int> numbers = new HashSet<int>();
while (numbers.Count < 100)
{
numbers.Add(rand.Next(100, 200));
}
randomNumbers = numbers.ToList();
}

private void btnrandomnumber_Click(object sender, EventArgs e)
{
count = 0;
CreateRandomNumber();
timerNumAnimation.Start();
}

private void timerRandomNumberChange(object sender, EventArgs e)
{
if (count < 100)
txtRandomShow.Text = randomNumbers[count++].ToString();
else
count = 0;
}

دوست عزیز ممنون ولی مشکل من داده های تکراری نیست مشکل من اینه که یه باتن توی فرمم دارم که با هر بار کلیک داده های داخل textbox 100 بار با استفاده از تایمری که گذاشتم عوض میشن تا به مشتری حس انتخاب یک عدد تصادفی رو بده. ولی فقط بار اول 100 بار اعداد عوض میشن و با هر کلیک اعداد کمتر عوض میشن به طوری که بعد از کلیک 10 یا 12 اعداد داخل textbox فقط یکی دوبار عوض میشن یا اصلا عوض نمیشن و فقط عدد تصادفی تولید شده با تابع راندوم رو نشون میده کدم رو هم که توی پست اول گذاشتم حالا اگه می شه راهنمایی کنید بسیار بسیار ممنون.

ژیار رحیمی
یک شنبه 04 مرداد 1394, 09:03 صبح
private void button1_Click(object sender, EventArgs e)
{
System.Threading.Tasks.Task.Factory.StartNew(
() => {
Random rnd = new Random();
for (int i = 0; i < 100; i++)
{
textBox1.Invoke((MethodInvoker)delegate
{
textBox1.Text = rnd.Next(100, 200).ToString();
});
System.Threading.Thread.Sleep(200);
}
});
}

ناامید
یک شنبه 04 مرداد 1394, 20:13 عصر
دوست عزیز ممنون ولی مشکل من داده های تکراری نیست مشکل من اینه که یه باتن توی فرمم دارم که با هر بار کلیک داده های داخل textbox 100 بار با استفاده از تایمری که گذاشتم عوض میشن تا به مشتری حس انتخاب یک عدد تصادفی رو بده. ولی فقط بار اول 100 بار اعداد عوض میشن و با هر کلیک اعداد کمتر عوض میشن به طوری که بعد از کلیک 10 یا 12 اعداد داخل textbox فقط یکی دوبار عوض میشن یا اصلا عوض نمیشن و فقط عدد تصادفی تولید شده با تابع راندوم رو نشون میده کدم رو هم که توی پست اول گذاشتم حالا اگه می شه راهنمایی کنید بسیار بسیار ممنون.

رویداد Tick تایمر رو در رویداد فرم load تعریف کنید.
private void Form1_Load(object sender, EventArgs e)
{
timerNumAnimation.Tick += new EventHandler(timerRandomNumberChange_Tick);
}

به نظر میاد که ابتدا 100 عدد تصادفی ایجاد میشه و به تدریج اون 100 عدد تصادفی تبدیل یه تعداد کمی عدد تصادفی میشه اما اینطور نیست چیزی که اتفاق میفته این هستش که سرعت تولید اعداد تصادفی بالا میره و در زمان بسیار کوتاهتری 100 عدد تصادفی تولید میشه به طوری که نمیشه اعداد تصادفی را مشاهده کرد.

به این صورت است:
سری اول یک رویداد Tick ایجاد میشه و یک بار عدد تصادفی تولید میشه و نمایش داده میشه. ( اینجا یک رویداد Tick داریم)
سری دوم یک رویداد Tick دیگر ایجاد میشه و با رویداد قبلی میشود دو رویدا و دو عدد تصادفی تولید و نمایش داده میشه. (اینجا دو رویداد Tick داریم)
سری سوم یک رویداد Tick دیگر ایجاد میشه و با رویداد های قبلی میشود سه رویداد و سه عدد تصادفی تولید و نمایش داده میشه. (اینجا سه رویداد Tick داریم)
.
.
.
سری دهم یک رویداد دیگر ایجاد میشه و با رویدادهای قبلی میشود 10 رویداد و 10 عدد تصادفی تولید و نمایش داده میشه.(اینجا ده رویداد Tick داریم)

در حقیقت اعداد تصادفی تولید میشود اما سرعت تولید و نمایش آنها به اندازه ای سریع است که نمیتوان آنها را مشاهده کرد.


و این که نیازی ندارید که بر روی تایمر دابل کلیک کنید تا رویداد Tick ایجاد شود به خاطر این که با رویدادی که در load تعریف میکنید میشود دو رویداد.

alireza264
یک شنبه 04 مرداد 1394, 22:10 عصر
سلام
مهندس گرامی mahan0o0 کدی که نوشتی نقصی نداره اما برای اینکه جواب بهتری بگیریذ یک تغییر کوچیک بدید فکر کنم به خواستت میرسی
تعریف متغیر رندم رو خارج ار متدNumbersMoving بنویسین. چون با هر بارفراخوانی متد NumbersMoving متغیر ra مجدد تعریف میشه و دوباره همون اعداد قبلی رو تولید میکنه


Random ra = new Random();

private void NumbersMoving()
{
int randm = ra.Next(100, 200);
txtRandomShow.Text = randm.ToString();
txtRandomShow.Refresh();
}


همینطور interval تایمر رو هم به یک دهم یا یک پنجم ثانیه تغییر بدید تا عدد تولید شده نمایش داده بشه و یا میتونی بعد از دستور واگذاری به تکست باکس اونو Refresh کنی

mahan0o0
دوشنبه 05 مرداد 1394, 11:52 صبح
سلام.

سلام.
شما میتونید از HashSet استفاده کنید و 100 مقدار متفاوت داشته باشید.
HashSet داده های تکراری رو قبول نمیکنه امتحان کنید:

private void button1_Click(object sender, EventArgs e)
{
HashSet<int> hashset = new HashSet<int>();
hashset.Add(1);
hashset.Add(1);
hashset.Add(2);
hashset.Add(2);
hashset.Add(3);
string hashsetItems = "";
foreach (var item in hashset)
{
hashsetItems += item.ToString() + ",";
}
MessageBox.Show(hashsetItems);
}



کد اصلی:


private void Form1_Load(object sender, EventArgs e)
{
timerNumAnimation.Tick += new EventHandler(timerRandomNumberChange);
}

private int count = 0;
private List<int> randomNumbers = new List<int>();

private void CreateRandomNumber()
{
Random rand = new Random();
HashSet<int> numbers = new HashSet<int>();
while (numbers.Count < 100)
{
numbers.Add(rand.Next(100, 200));
}
randomNumbers = numbers.ToList();
}

private void btnrandomnumber_Click(object sender, EventArgs e)
{
count = 0;
CreateRandomNumber();
timerNumAnimation.Start();
}

private void timerRandomNumberChange(object sender, EventArgs e)
{
if (count < 100)
txtRandomShow.Text = randomNumbers[count++].ToString();
else
count = 0;
}
دوست عزید کدتون رو امتحان کردم عالی بود فقط من میخوام بعد از اینکه 100 عدد تصادفی ایجاد شد از عدد 100 به عنوان عدد تصادفی استفاده کنم و این عدد با کلیک بعدی دیگه تو لیست اعداد تصادفی نیاد یعنی 99 عدد تصادفی تولید شه و به همین ترتیب اگه 20 بار کلیک کردم 80 عدد تصادفی تولید شه یعنی اون 20 تا عدد دیگه توی اون 80 تا تکرار نشه واسه حل این مشکل چیکار کنم؟ ممنون میشم کمک کنید کجای کد اصلی که از دوستم رو گذاشتم باید تغییر بدم؟

mahan0o0
دوشنبه 05 مرداد 1394, 18:19 عصر
دوستان لطفا کمک کنید همین یک مشکل رو دارم

alireza264
دوشنبه 05 مرداد 1394, 22:01 عصر
سلام
یه لیست بساز و اعداد 100 تا 200 رو توش بریز( لیست حاوی 100 تا سطز میشه ) بعد یک عدد تصادفی رو بین 0 تا تعداد عناصر لیست رو تولید کن و عدد داخل اون سطر لیست رو بعنوان عدد تولید شده اعلام کن و اون سطر رو حذف کن
به این ترتیب دیگه عدد تکراری تولید نمیشه و بدلیل حذف سطر اعلام شده هر بار یک سطر هم کم میشه

mahan0o0
دوشنبه 05 مرداد 1394, 23:03 عصر
سلام
یه لیست بساز و اعداد 100 تا 200 رو توش بریز( لیست حاوی 100 تا سطز میشه ) بعد یک عدد تصادفی رو بین 0 تا تعداد عناصر لیست رو تولید کن و عدد داخل اون سطر لیست رو بعنوان عدد تولید شده اعلام کن و اون سطر رو حذف کن
به این ترتیب دیگه عدد تکراری تولید نمیشه و بدلیل حذف سطر اعلام شده هر بار یک سطر هم کم میشه

ممنونم منظورتون رو متوجه شدم خودم هم این راه حل به هنم رسید مشکل اینه که کدش رو نمیتونم بنویسم اگه بر مبنای همون کد بالا که گذاشتم بگید چطور میشه بسیار ممنون میشم

ناامید
دوشنبه 05 مرداد 1394, 23:23 عصر
عذر میخوام فراموش کردم تایمر رو متوقف کنم.
البته میدونم خودتون این مشکل رو رفع کردید ولی گفتم اشاره کنم.

if (count < 100)
txtRandomShow.Text = randomNumbers[count++].ToString();
else
{
count = 0;
timerNumAnimation.Stop(); // اینجا
}

mahan0o0
سه شنبه 06 مرداد 1394, 00:36 صبح
عذر میخوام فراموش کردم تایمر رو متوقف کنم.
البته میدونم خودتون این مشکل رو رفع کردید ولی گفتم اشاره کنم.

if (count < 100)
txtRandomShow.Text = randomNumbers[count++].ToString();
else
{
count = 0;
timerNumAnimation.Stop(); // اینجا
}

ممنون دوست عزیز اره خودم متوقفش کرده بودم الان مشکل اصلیم رو توی پست 10 مطرح کردم لطفا اگه امکان داره راهنمایی کنید خیلی خیلی ممنون میشم

ناامید
سه شنبه 06 مرداد 1394, 01:04 صبح
چشم.
ولی من باید برم سرکار تا برگردم اگر دوستان راهنمایی نکردن در خدمتم دوست عزیز وظیفه ای بیش نیست.

mahan0o0
سه شنبه 06 مرداد 1394, 07:24 صبح
چشم.
ولی من باید برم سرکار تا برگردم اگر دوستان راهنمایی نکردن در خدمتم دوست عزیز وظیفه ای بیش نیست.

دوست عزیر بسیار ممنون خیلی لطف دارید. فقط من این پروژه رو باید تا چند ساعت دیگه تحویل بدم اگه از دوستان کسی راه حل مشکل منو داره خیلی خیلی ممنون میشم الان تنها مشکل برنامم همینه

ناامید
سه شنبه 06 مرداد 1394, 18:59 عصر
private List<int> lstNumbers;
private void CreateNumbers()
{
lstNumbers = new List<int>();
for (int i = 100; i <= 200; ++i)
{ lstNumbers.Add(i); }
}
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
CreateNumbers();
}

private void btnrandomnumber_Click(object sender, EventArgs e)
{
if (lstNumbers.Count == 0)
{
MessageBox.Show("اتمام قرعه کشی، تمامی اعضا انتخاب شده اند");
}
else
{
Random rand = new Random();
int winner = rand.Next(0, lstNumbers.Count);
txtRandomShow.Text = lstNumbers[winner].ToString();
lstNumbers.RemoveAt(winner);
}
}
}