PDA

View Full Version : تولید تصادفی رکورد



mortezamsp
چهارشنبه 02 دی 1388, 13:37 عصر
با سلام .
من باید برای یه برنامه ای حدود 10000 رکورد داشته باشم، شامل نام،نامخانوادگی،وشماره تلفن که مجموعا میشن 64 بایت .
یه برنامه تولید رندوم رکورد نوشتم ، ولی مشکل اینه که این رکوردها باید سورت شده باشن.
بنظر شما چطور باید تابع تولید رندوم رکورد را بنویسم که کوردی که تولید میکند ، سورت شده باشد ؟
یعنی روی نام سورت شده باشند.یعنی وقتی تولید میشوند، به ترتیب تولید شوند؟

qwerty11
چهارشنبه 02 دی 1388, 14:41 عصر
خوب آخر سر sort کن ! مشکلش چیه ؟؟

Hamid.Kad
چهارشنبه 02 دی 1388, 14:55 عصر
اگر نظم خاصی برات مطرح نیست (مثلاً تعداد حروف) میتونی به ترتیب حروف الفبای انگلیسی تولید کنی دیگه !
مثلاً 500 تا رکورد با شروع از حرف a تولید کنی. (که به ترتیب تعداد کاراکترها زیاد میشه)
بعد میری سراغ b و ....
تولید کردنش هم که کاری نداره. اگر خواستید بفرمائید سورس رو بنویسم براتون

mortezamsp
چهارشنبه 02 دی 1388, 15:17 عصر
وب آخر سر sort کن ! مشکلش چیه ؟؟
اما من نمیتونم و نمیخوام این همه رکورد رو بریزم تو رم، باید تو فایل بنویسمشون.و سورت کردن در فایل کار بسیار زمان بری هست. حالا اینجا گفته 10000 اگه بخوام بکنمش 10000000 تا چی ؟


اگر خواستید بفرمائید سورس رو بنویسم براتون
حتما . ممنون میشم .

qwerty11
چهارشنبه 02 دی 1388, 15:47 عصر
اما من نمیتونم و نمیخوام این همه رکورد رو بریزم تو رم، باید تو فایل بنویسمشون.و سورت کردن در فایل کار بسیار زمان بری هست. حالا اینجا گفته 10000 اگه بخوام بکنمش 10000000 تا چی ؟
وا ! چرا نمیتونی 10000 تا رکورد رو بریزی تو رم !؟ در ضمن 7^10 تا رکورد رو هم نمیتونی داشته باشی ! اگه int بودن میشد، ولی واسه رکورد خیلی خیلی زیاده و اینقدر حافظه نداریم.

میتونی از set هم استفاده کنی. set خودش به صورت sort شده اضافه میکنه ...

mortezamsp
پنج شنبه 03 دی 1388, 00:19 صبح
حالا شما بیا و بزرگی کن و یه تابع معرفی کن که رکوردهای تصادفی سورت شده ارائه دهد . یعنی مثلا اولین رکوردش فیلد اسمش با a شروع شود و آخرین رکورد فیلد اسمش با Zشروع شود.
ممنون.

tdkhakpur
پنج شنبه 03 دی 1388, 00:55 صبح
خوب شما برای مرتب سازی نباید مستقیما با داده های رکورد سرو کار داشته باشید بلکه (پیشنهاد) یک فایل مجزا برای sort ایجاد کنید و هر رکوردی را که وارد بانک میکنید شمار رکورد رو داخل فایل sort قرار بدید البته قبل از قرار دادن شماره رکورد در فایل sort فیلد نام رکورد را با سایر رکورد ها مقایسه کنید و مشخص کنید که شماره رکورد فعلی باید در کدام محل از فایل sort قرار گیرد.(الگوریتم مرتب سازی فاکس پرو)

mortezamsp
پنج شنبه 03 دی 1388, 01:31 صبح
البته میدانم که چقدر بلد هستید ، منم بلد هستم ،ولی خواهشا فقط و فقط به همین سوالی که پرسیدم جواب بدید .

آخه این یه تمرین دانشجوییه !:عصبانی:بالاخره مجبورم کردین بگم !

ببین این کد منه که رکورداش سورت شده نیست :
har* Record :: RecordCreateRandly(int RecordNumber)
{
time_t t;
t=time(&t);
//65-90 ; 97-122
char fn[21],ln[21],pn[17];
//making random strings, contains alphabets : 65~90 , and 0~9
int i;
for( i=0 ;i<20 ;i++ )
{
srand( RecordNumber + i + t );
fn[i] = 65+( abs(rand()*100)%26 ) ;
ln[i] = 65+( abs(rand()*100)%26 ) ;
}
fn[20] = '|' ;
fn[21] = NULL;
ln[20] = '|' ;
ln[21] = NULL;
for( i=0 ;i<16 ;i++ )
pn[i] = 48+( abs(rand()*1000)%10 ) ;
pn[16] = '|' ;
pn[17] = NULL;
//making record
RecordString[5] = NULL;
RecordString[1] = RecordNumber;
strcat( RecordString ,fn );
strcat( RecordString ,ln );
strcat( RecordString ,pn );
return ( RecordString ) ;
}

ولی میخوام سورت شده باشه . کمکم کنید .ممنون .

pesar irooni
سه شنبه 22 دی 1388, 03:28 صبح
من منطق الگوریتمت رو نمیفهمم. اگه میخوای مرتب باشه دیگه واسه میگی رندم.
حالا به هر حال فک کنم اگه بتونی seed تابع random رو تغییر بدی و در هر بار اجرای حلقه محدوده اعدادی که randomمیتونه واست تولید کنه رو کم کنی به چیزی که میخوای میتونی برسی. مثلا
65+( abs(rand()*100)%2 ) حتما یا a رو بهت میده یا b رو. بعد میتونی %2 رو کنی %3 مثلا به کمک i. البته با اضافه کردن 1 به مقدار اولیه 65 میتونی مجبور کنی در اجراهای بعدی حلقه a رو تولید نکنه و الی آخر.

mortezamsp
سه شنبه 22 دی 1388, 11:57 صبح
من منطق الگوریتمت رو نمیفهمم. اگه میخوای مرتب باشه دیگه واسه میگی رندم.


رکوردها باید تصادفی باشن ، من حوصله ندارم 6 مگابایت رکورد خودم بسازم !

ضمنا فایل باید حاوی رکوردهای سورت شده باشن . آیا شما میخواین من یه فایل 6 مگابایتی رو بازکنم و سورتش کنم ؟

من دنبال راه راحت تری هستم : "رکوردهای تصادفی تولید شده ، مرتب باشند " الآن متوجه شدید ؟ یه هفته هم بیشتر وقت ندارم . مرسی .

pesar irooni
پنج شنبه 24 دی 1388, 14:01 عصر
آیا شما میخواین من یه فایل 6 مگابایتی رو بازکنم و سورتش کنم ؟

نیازی به این کار نیست. تو میتونی از insertion sort استفاده کنی. یعنی هر رکورد رو که تولید میکنی ببری بزاری سرجاش و اگه همین کار رو تکرار کنی فایلت مرتب میمونه و وقتی مثلا رکورد 1000 رو تولید کردی یه فایل مرتب با 999 عنصر داری. نیازی نیست این رکورد رو با 999 عنصر مقایسه کنی. کافیه رکورد 1000 ام را با عنصر 500 مقایسه کنی و اگه کوچکتر بود با 250 و اگر بزرگتر بود با 750 تا این که بالاخره جاش پیداشه. اما به هرحال برای مرتب سازی فایلها الگوریتمهای خیلی بهتری هم وجود داره.
++++++++++++++++++++++++++++++++++++++++++++++++++ ++
به هر حال فرض میکنیم شما نمیخوای مرتب سازی رو انجام بدی و میخوای خودش مرتب باشه

رکوردها باید تصادفی باشن ، من حوصله ندارم 6 مگابایت رکورد خودم بسازم !

ببین وقتی میگی مرتب باشن یعنی نظم داشته باشن و وقتی نظم داشته باشن دیگه تصادفی نیستند!

ببین کافیه overflow رو شبیه سازی کنی. یعنی از یه عدد که بصورت افزایشی رشد میکنه استفاده کنی. این عدد ابتدا aaaaaaaaa رو تولید میکنه و بعد از اضافه شدن مقدارش در رکورد بدی aaaaaaaab رو تولید میکنه الی آخر. حالا اگه RecordNumber ات افزایشی باشه میتونی از اون استفاده کنی وگرنه یه متغیر سراسری بساز که با ساخت هر رکورد یکی به مقدارش اضافه بشه. فقط کافیه جمله for ات رو به شکل زیر تغییر بدی:

for( i=0 ;i<20 ;i++ )
{
fn[19-i] = 65 + num%26;
ln[19-i] = 65 + num%26;
num = num/26;
}
و یا


for( i=0 ;i<20 ;i++ )
{
ln[19-i] = 65 + num%26;
num = num/26;
}
for( i=0 ;i<20 ;i++ )
{
fn[19-i] = 65 + num%26;
num = num/26;
}
با شماره تلفن فعلا کاری نداریم.
من برنامه ات رو تغییر دادم تا اون چیزی که میخواد برات تولید کنه ولی خوب مسلما تصادفی نیست چون ما میدونیم چی میخواد تولید شه. گذاشتم اینجا. اجرا کن ببین همونیه که میخوای!!!

#include "iostream.h"
#include "time.h"
#include "stdlib.h"
#include "string.h"
char* CreateRandomly(int RecordNumber)
{
char* RecordString=new char[60];
int num = RecordNumber;
time_t t;
t=time(&t);
//65-90 ; 97-122
char fn[21],ln[21],pn[17];
//making random strings, contains alphabets : 65~90 , and 0~9
int i;
for( i=0 ;i<20 ;i++ )
{
ln[19-i] = 65 + num%26;
num = num/26;
}
for( i=0 ;i<20 ;i++ )
{
fn[19-i] = 65 + num%26;
num = num/26;
}
fn[20] = '|' ;
fn[21] = NULL;
ln[20] = '|' ;
ln[21] = NULL;
for( i=0 ;i<16 ;i++ )
pn[i] = 48+( abs(rand()*1000)%10 ) ;
pn[16] = '|' ;
pn[17] = NULL;
//making record
//RecordString[4] = NULL;
itoa(RecordNumber,RecordString,0);
strcat( RecordString ,fn );
strcat( RecordString ,ln );
strcat( RecordString ,pn );
return ( RecordString ) ;
}
main()
{
for(int i = 0; i<10; i++)
cout<<CreateRandomly(i)<<"\n";
cin>>"";
}