ورود

View Full Version : سوال: تولید عدد تصادفیc++ در در بازه 0 و 1



ati6640
دوشنبه 19 تیر 1391, 17:22 عصر
سلام
میشه به من کمک کنید برای برنامه ای در c++ که 1000 تا عدد تصادفی را در بازه صفر و یک تولید کنه

من خیلی وقته زبان سی کار نکردم و خیلی چیزا رو فراموش کردم

ممنون میشم اگه کمک کنید

بهروز عباسی
دوشنبه 19 تیر 1391, 18:50 عصر
درود
لینک های زیرو ببین
http://www.cplusplus.com/reference/clibrary/cstdlib/rand/

http://www.cprogramming.com/tutorial/random.html

موفق باشید.

بهروز عباسی
دوشنبه 19 تیر 1391, 19:19 عصر
دوست عزیز اینم کد یک برنامه کامل در این باره (اما به این کد تکیه نکن و سعی کن درک کنی که برنامه چه کاری انجام داده:متفکر:)

#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <iostream.h>

int main()
{
cout << "\tgenerate random numbers between (min,max)\n ";
cout << "\tCompiled in Borland c++ 5.02 \n";
cout << "\tcoded by: Behrooz Abbasi\n ";
cout << "\twww.Programming-Co.Com \n\n";
cout << "++++++++++++++++++++++++++++++++++++++++++++++++++ ++ \n\n";
unsigned a = time(NULL);
srand(a);

int min, max;

cout << "Enter minimum Value : "; cin >> min ;
cout << "Enter maximum Value : "; cin >>max;

int range = max - min + 1;
for (int i = 0; i < 30; i++)
{
int rnd = rand()/100%range + min;
cout << rnd << " ";
}
cout << endl;
getch();
return 0;
}

موفق باشید.

ati6640
دوشنبه 19 تیر 1391, 21:03 عصر
مرسی از جوابتون.
ولی منظورم این بود که بین صفر و یک باشه.یعنی هم خود صفر و یک هم بقیه اعداد که اعشاری میشن.

the king
دوشنبه 19 تیر 1391, 22:40 عصر
مرسی از جوابتون.
ولی منظورم این بود که بین صفر و یک باشه.یعنی هم خود صفر و یک هم بقیه اعداد که اعشاری میشن.


#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <iostream.h>

const int n = 1000;

int main()
{
srand(time(0));
float x[n];
float max = (float)RAND_MAX;
for (int i = 0; i < n; i++)
x[i] = (float)rand() / max;

for (int i = 0; i < n; i++)
cout << x[i] << " ";
getch();
return 0;
}

ati6640
دوشنبه 19 تیر 1391, 23:11 عصر
واقعاً ممنون.خیلی لطف کردین
فقط میشه بگید چرا دو بار for تعریف کردین، باهمان یه حلقه نمیشه؟و اینکه srand(time(0 دقیقاً چیکارمیکنه؟آخه من همینو نوشته بودم بجز srand.باز ممنون میشم اگه زحمت بکشید توضیح بدید

++Hichkas
دوشنبه 19 تیر 1391, 23:37 عصر
بسم رب المهدی(عج)
سلام
Srand(time(0)) برای اینکه اعداد تصادفی با استفاده از زمان تولید بشه چون زمان هیچ وقت تکرار نداره
یا حق

the king
سه شنبه 20 تیر 1391, 00:47 صبح
واقعاً ممنون.خیلی لطف کردین
فقط میشه بگید چرا دو بار for تعریف کردین، باهمان یه حلقه نمیشه؟و اینکه srand(time(0 دقیقاً چیکارمیکنه؟آخه من همینو نوشته بودم بجز srand.باز ممنون میشم اگه زحمت بکشید توضیح بدید

حلقه دوم مستقیما ربطی به درخواست شما نداره، صرفا برای نمایش محتویات آرایه است تا بدانید اون 1000 عدد الان چه مقداری دارند.

اعداد تصادفی ای که کامپیوتر می سازه واقعا تصادفی نیستند، یک مقدار اولیه که بهش seed می گویند رو مبنا قرار میده و اعدادی که ظاهرا
تصادفی اند رو بر اساس اون seed ایجاد می کنه. اگر شما برنامه رو هر بار با یک seed مشخص و ثابت اجرا کنید، اون 1000 اعداد تصادفی
هر بار یکسان اند. یعنی اگه برنامه رو 100 بار هم اجرا کنید، 1000 هزار عدد تصادفی بدست می آورید که هر دفعه مثل دفعات قبلی اند.
معمولا قبل از اینکه اولین عدد تصادفی رو ایجاد کنند یکبار seed رو بر اساس ساعت سیستم تنظیم می کنند، چون احتمال اینکه دفعات بعدی
همون seed باشه تقریبا صفره.

ati6640
سه شنبه 20 تیر 1391, 12:52 عصر
ممنون از جوابتون.میخوام یک میلیون عدد تصادفی بده ولی ارور میده.تا صد هزار رو میده ولی واسه یکمیلیون ارور میده.به خاطر چیه و چیکارش کنم درست شه؟مرسی

the king
سه شنبه 20 تیر 1391, 16:53 عصر
ممنون از جوابتون.میخوام یک میلیون عدد تصادفی بده ولی ارور میده.تا صد هزار رو میده ولی واسه یکمیلیون ارور میده.به خاطر چیه و چیکارش کنم درست شه؟مرسی

خسته نباشید، اولا متغیر های int اگه کامپایلر 16 بیتی باشه برای اعداد بزرگتر از 32767 جا ندارند، باید بجای نوع داده int از long استفاده بشه.
در ضمن نوع داده float معمولا 4 بایتی یه، یک میلیون تاش میشه 4 مگابایت. بستگی به کامپایلر تون داره، حداکثر حافظه ای که یک برنامه 32 بیتی از
سیستم عامل ویندوز دریافت می کنه در کل 2 گیگابایت بیشتر نمیشه. اما اگه کامپایلر تون 16 بیتی باشه ممکنه محدودیت حافظه بیشتری
داشته باشه، فرضا حداکثر یک سگمنت (64 کیلوبایت) برای فضای داده تون در نظر بگیره.

#target
سه شنبه 20 تیر 1391, 17:16 عصر
دقیقا میخوای چکار کنین این یک میلیونو !؟ شاید روشی باشه که نیاز نباشه اینطور ساخته بشه


در ضمن نوع داده float معمولا 4 بایتی یه، یک میلیون تاش میشه 4 گیگابایت.
4 مگابایت یا گیگابایت !!!!!!!!!!!

the king
سه شنبه 20 تیر 1391, 17:28 عصر
دقیقا میخوای چکار کنین این یک میلیونو !؟ شاید روشی باشه که نیاز نباشه اینطور ساخته بشه


4 مگابایت یا گیگابایت !!!!!!!!!!!

عذر می خوام، حق با شما است، مگابایت.

ati6640
چهارشنبه 21 تیر 1391, 01:27 صبح
مرسی.حالا یعنی نمیشه؟چیکار کنم درست شه؟

ati6640
چهارشنبه 21 تیر 1391, 01:30 صبح
واسه شبیه سازی میخوام.نیاز به یک میلیون عدد تصادفی دارم که بررسیشون کنم.بعداستفادشون کنم.

the king
چهارشنبه 21 تیر 1391, 01:45 صبح
واسه شبیه سازی میخوام.نیاز به یک میلیون عدد تصادفی دارم که بررسیشون کنم.بعداستفادشون کنم.

تخصیص حافظه Dynamic (با [new float[n ) رو امتحان کنید، این کد در Microsoft Visual C++ 6.0 مشکلی نداره :

#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <iostream.h>

const long n = 1000000;

int main(int argc, char* argv[])
{
long i;
srand(time(0));
float *x = new float[n];
float max = (float)RAND_MAX;
for (i = 0; i < n; i++)
x[i] = (float)rand() / max;

for (i = 0; i < n; i++)
cout << x[i] << " ";
getch();
return 0;
}

ati6640
چهارشنبه 21 تیر 1391, 02:21 صبح
مرسی از لطفتون.ببخشید بهتون زحمت دادم.
ایشاله در آینده هم بتونم از کمک هاتون بهره مند بشم.ممنون
برنامه رو که اجرا می کنم ارور نمیده ولی 1 میلیون عدد نمیده،299 تا میده

بهروز عباسی
چهارشنبه 21 تیر 1391, 10:49 صبح
برنامه رو که اجرا می کنم ارور نمیده ولی 1 میلیون عدد نمیده،299 تا میده
کامپایلرت چیه از من Borland C++ 5 اجرا شد مشکلی نداشت الان همین جوری توی صفحه کد میاد....

ati6640
چهارشنبه 21 تیر 1391, 17:57 عصر
واسه منم همینه. ارور نمیده.اجرا میشه.ولی 299 تای آخر رو میده.نه همشو.واسه 1000 تا عدد هم تست کردم باز همون 299 تا رو میده.یعنی حجمش زیاده؟نمیشه بتونم همه عددها روداشته باشم؟

#target
چهارشنبه 21 تیر 1391, 19:05 عصر
این کدو نوشتم با استفاده از توابع ویندوز برا تخصیص حافظه بنظر کار میکنه !
ی تابع برا ایجاد اعداد هست !
اول اومدم 4 مگابایت حافظه تخصیص دادم !!
که میشه حدود 1048576 عدد چهار بایتی بعدم اشاره گر پایانی رو تایین کردم نقطه شروع بعلاوه چهار مگابایت حالا تا زمانی که به پایان نرسیدیم یکی یکی عدد ایجاد میکنم و داخل حافظه مینویسه . بعدش اشاره گر رو چهار بایت یا اندازه ی متغیر میبره جلو

#include <Windows.h>
#include <iostream.h>
void* Pt;
void CreateNumbers();
float GetNumber (int i);
int main()
{
CreateNumbers();
cout << GetNumber(1000000);
}

void CreateNumbers()
{
Pt = VirtualAlloc(NULL, 0x400000 , MEM_COMMIT | MEM_RESERVE ,PAGE_READWRITE );
void* PtEnd = (void*)((int)Pt + 0x400000);
void* Pointer = Pt;
while (Pointer < PtEnd)
{
*(float*)(Pointer) = (float)rand()/(float)RAND_MAX;
(int)Pointer += sizeof(float);
}
}

float GetNumber (int i)
{
return *(float*)((int)Pt + (i * sizeof(float)));
}

برا گرفتم هر عدد هم تابع GetNumber(x); رو فراخوانی کنید که داخل پرانتر شماره عدد تصادفیه ! مثلا تو کد عدد یک میلیون رو گرفتم !

اون کدی که هم که بالا دوستان نوشتم هیچ ایرادی نداره و کار میکنه !