PDA

View Full Version : سوال: مشکل در انتخاب تصادفی



هم دانشگاهی
سه شنبه 30 شهریور 1389, 11:10 صبح
من یه کد نوشتم که تو یه ماتریس 10*10 , 10تا عدد رو به صورت تصادفی انتخاب میکرد اما نمیدونم چرا بیشتر ( اغلب اوقات ) روی قطر اصلی انتخاب میشن! تازه زمان اجرا هم خیلی پایینه!

اگه میتونین کمک کنین؟
کد:

#include <iostream>
#include <conio.h>
#include <stdlib.h>
using namespace std;
int main()
{ int count=0,i=0,j=0;
char a[10][10];
for(i=0;i<10;i++)
{
for(j=0;j<10;j++)
a[i][j]='O';
}
while(count<=10)
{
while(1)
{
srand(time(0));
i=1+rand()%9;
srand(time(0));
j=1+rand()%9;
if(a[i][j]=='*')
continue;
if(a[i][j]=='O')
a[i][j]='*';
count++;
break;
}
}
for(i=0;i<10;i++){
for(j=0;j<10;j++){
cout<<a[i][j]<<" "; }
cout<<endl; }
getch();
return 0;
}

Salar Ashgi
سه شنبه 30 شهریور 1389, 12:14 عصر
بعد main کد زیر رو اضافه کنید :



srand(time(0));


تازه زمان اجرا هم خیلی پایینه!
شما این همه حلقه تو در تو استفاده کردید ، مطمئنا اینها سرعت انجام عملیات برنامه ، را کاهش
خواهد داد ، خصوصا حلقه وحشتناک بی نهایت While 1 !

هم دانشگاهی
سه شنبه 30 شهریور 1389, 21:58 عصر
من srand رو هم تو برنامم نوشته بودم ! باز هم اغلب اوقات روی قطر اصلی انتخاب میشه!
نمیدونم چرا؟

در ضمن حلقه ها رو هم به یک حلقه تبدیل کردم باز هم تغییری نکرد؟ اینم کدم:

اگه میتونین کمک کنین! ممنون :لبخندساده:

void life::Random()
{
int count=0,i=0,j=0;
while(count<=10)
{
srand(time(0));
i=1+rand()%9;
srand(time(0));
j=1+rand()%9;
if(a[i][j]=='*')
continue;
if(a[i][j]=='O')
{
a[i][j]='*';
count++;
}
}
}

Salar Ashgi
سه شنبه 30 شهریور 1389, 23:49 عصر
کد آموزشی زیر رو واسه یه ماتریس 3 × 3 نوشتم ، ولی با ایده گرفتن میشه واسه یه ماتریس n × n نیز
تعمیم داد !
توضیح : این کد از بین درایه های یک ماتریس 3 × 3 ، 3 عنصر را بطور تصادفی انتخاب کرده و در یک آرایه
قرار میدهد ./



#include <iostream>
#include <conio>
#include <stdlib>
int main(){
srand(time(0));
int a[][3]={{1,2,3},{4,5,6},{7,8,9}};
int rands[3];
int x=0,y=0,f=0;
for(int i=1;i<=3;i++){
x = rand()%3;
y = rand()%3;
rands[f++] = a[x][y];}
for(int i=0;i<3;i++)
cout<<"Rand "<<(i+1)<<": "<<rands[i]<<endl;
getch();
}

ashkan_d13
چهارشنبه 31 شهریور 1389, 06:46 صبح
اعداد تصادفی به این شکل تولید میشن که عملیاتی روی عدد تصادفی قبلی انجام میشه و یه عدد جدید بدست میاد، کار srand هم اینه که اون عدد اولیه رو ایجاد میکنه، وقتی شما میاین تو یه حلقه می نویسین ((srand(time(0 هر بار زمان جاری سیستم میشه اون عدد پایه، اما چون سرعت اجرای دستورات سریعتر از عوض شدن زمان سیستم (احتمالاً میلی ثانیه) هست، پس با چند بار اجرای دستورات فقط یک عدد تولید میشه (چون عدد پایه ی تولید عدد تصادفی (هسته) ثابته) پس طبیعیه که i و j برابر بشن و سرعت اجرا هم کم بشه؛ پس srand رو فقط باید یه بار اول برنامه بنویسین.

هم دانشگاهی
چهارشنبه 31 شهریور 1389, 07:41 صبح
واقعا ممنونم ! درست شد! :تشویق:

پس حالا میفهمم چرا همش رو قطر اصلی انتخاب میشه! تازه این جوری سرعت اجرا برنامه هم خیلی رفت بالا!