PDA

View Full Version : سوال: عدد تصادفی بین 0 و1



root88
شنبه 20 شهریور 1389, 21:19 عصر
با سلام،
من یه کد نوشتم که عدد تصادفی رو بین 1 تا عدد n رو تولید میکنه. اما نمی دونم چطور با تابع rand یه عدد تصادفی بین 0 و1 تا دو رقم اعشار ایجاد کنم؟ کد رو به صورت زیر تغییر دام همش صفر میده .ممنون میشم راهنمایی کنید.


srand(time(0));
int r=1;
double n= rand()%r;

Salar Ashgi
شنبه 20 شهریور 1389, 22:25 عصر
یه متود نسبتا کاربردی براش نوشتم :



#include <iostream>
#include <conio>
#include <string>
#include <stdlib>
using namespace std;
string Binary_Rand(){
string str="0.";
char ar[3];
int a = 100+rand()%900;
str+=itoa(a,ar,10);
return str;}
int main(){
srand(time(0));
for(int i=1;i<=10;i++){
cout<<Binary_Rand()<<endl;
cout<<"=========\n";}
getch();
}


موفق باشید ./

clover
شنبه 20 شهریور 1389, 23:26 عصر
یه روش ساده می تونه این باشه :

srand(time(0));
double r = rand()%100;
r /= 100;

root88
چهارشنبه 24 شهریور 1389, 23:21 عصر
دوستان ممکنه که تابع rand تو بازه 100 تایی همش از نیمه پایین یعنی 50 تای اول انتخاب کند من 30 با امتحان کردم اینطوری شد؟

Pouri_sb
چهارشنبه 24 شهریور 1389, 23:46 عصر
دوستان ممکنه که تابع rand تو بازه 100 تایی همش از نیمه پایین یعنی 50 تای اول انتخاب کند من 30 با امتحان کردم اینطوری شد؟

عدد تصادفی می ده دیگه! خودت از یک تا صد رو بنویس رو کاغذ سی بار در بیار. ممکنه هر سی تا زیر 50 باشه!

مگر اینکه بازه درست نداده باشی وگرنه کارش درسته :چشمک:

Salar Ashgi
پنج شنبه 25 شهریور 1389, 00:43 صبح
دوستان ممکنه که تابع rand تو بازه 100 تایی همش از نیمه پایین یعنی 50 تای اول انتخاب کند من 30 با امتحان کردم اینطوری شد؟

اگر از دستور srand استفاده کنید ، اعداد تصادفی تولید شده تکراری نخواهند بود ./

root88
پنج شنبه 25 شهریور 1389, 10:15 صبح
ممنون دوستان ، مشکلش این بود که من قبل از تقسیم کلمه double رو فراموش کرده بودم. یه سوال دیگه دارم اونم اینه که تو تابع زیر یه عدد تصادفی بین صفر و یک تولید میشه( که در واقع نقش یه احتمال رو بازی میکنه ). در ادامه بررسی میشه که اگر این عدد تصافی تولید شده بین کران بالا و پایین یکی از گره های لیست بود شناسه اون گره برگردونده بشه.مشکل اینجاست که وقتی عدد تصادفی تولید میشه یه مقدار تو تبدیلش به احتمال عدد تغییر میکنه. مثلا اگر 56 تولید شده احتمالش میشه 0.560000002 یا 0.599999999 در حالیکه من فقط به خود 0.56 احتیاج دارم. لطفا منو راهنمایی کنید.


int selectRandomAct()
{
srand(time(0));
int r=100;
int m=rand()%r;
double n=(double)m/100;
for(it=actions.actionList.begin();it!=actions.acti onList.end();it++)
{
if(it->getLow()<=n && n<=it->getHigh())
return it->getId();
}
}

حتی اگه این خط رو هم اضافه کنم تاثیری نداره

n*=100;n=floor(n);n/=100;

Salar Ashgi
پنج شنبه 25 شهریور 1389, 16:21 عصر
مشکل اینجاست که وقتی عدد تصادفی تولید میشه یه مقدار تو تبدیلش به احتمال عدد تغییر میکنه. مثلا اگر 56 تولید شده احتمالش میشه 0.560000002 یا 0.599999999 در حالیکه من فقط به خود 0.56 احتیاج دارم.


اگه اینطوری که میگید باشه ، میتونید از توابع Ceil , Round استفاده کنید ./

root88
پنج شنبه 25 شهریور 1389, 16:36 عصر
ممنون منCeil رو فهمیدم اما تابع Round رو پیدا نکردم.

Salar Ashgi
پنج شنبه 25 شهریور 1389, 19:52 عصر
منCeil رو فهمیدم اما تابع Round رو پیدا نکردم.

تابع ceil بطور پیش فرض در توابع کتابخانه Math.h موجود است ، اما round رو باید خودتون پیاده سازی کنید ./