PDA

View Full Version : حرفه ای: تولید اعداد تصادفی با درنظر گرفتن احتمال



omid.mohamadi
جمعه 16 تیر 1391, 14:46 عصر
سلام.در سایت در این مورد جستجو کردم اما اون کدی که مد نظرم بود رو پیدا نکردم . من می خوام برنامه یک بازه مثلا 0 تا 100 رو دریافت کنه و مثلا به احتمال 60 درصد اعداد تولید شده اش بین 0 تا 60 باشه و به احتمال 40 درصد اعداد تولید شده بین 61 تا 100 باشه.
کسی پیشنهادی نداره ؟:افسرده:

returnx
جمعه 16 تیر 1391, 17:22 عصر
می تونید خودتون این کار و انجام بدید ،
ابتدا 60 % از تعداد کل اعداد Random که قرار تولید کنید رو محاسبه کنید ، به این تعداد اعداد را در بازه 0 تا 60 و 40% بقیه رو در بازه ی 61 تا 100 تولید کنید...
روش بالا در صورتی جواب میده که شما بدونید چه تعداد (تعداد کل) عدد تصادفی قرار تولید کنید...

Beginner2013
جمعه 16 تیر 1391, 17:41 عصر
سلام.در سایت در این مورد جستجو کردم اما اون کدی که مد نظرم بود رو پیدا نکردم . من می خوام برنامه یک بازه مثلا 0 تا 100 رو دریافت کنه و مثلا به احتمال 60 درصد اعداد تولید شده اش بین 0 تا 60 باشه و به احتمال 40 درصد اعداد تولید شده بین 61 تا 100 باشه.
کسی پیشنهادی نداره ؟:افسرده:

int rnd=0;
Random R = new Random();
if(R.Next(0,100)<60)
rnd=R.Next(0,60);
else
rnd=R.Next(60,100);

در مثالی که شما خواستید میشد فقط عددی رو بین 0 و 100 به صورت رندم انتخاب کرد و به خودی خود احتمالاتی که شما گفتید درست در میومد،یعنی کد فوق لازم نبود و میشد براحتی نوشت

R.Next(0,100)

برای اینکه قضیه رو بهتر متوجه بشید من بازه رو بین 0و150 در نظر می گیرم و مثلا می خوام احتمال اینکه عددم بین 0 و 50 باشه 80% و احتمال اینکه عددم بین 50 و 150 باشه 20% باشه

int rnd=0;
Random R = new Random();
if(R.Next(0,100)<80)
rnd=R.Next(0,50);
else
rnd=R.Next(50,150);

the king
جمعه 16 تیر 1391, 17:55 عصر
سلام.در سایت در این مورد جستجو کردم اما اون کدی که مد نظرم بود رو پیدا نکردم . من می خوام برنامه یک بازه مثلا 0 تا 100 رو دریافت کنه و مثلا به احتمال 60 درصد اعداد تولید شده اش بین 0 تا 60 باشه و به احتمال 40 درصد اعداد تولید شده بین 61 تا 100 باشه.
کسی پیشنهادی نداره ؟:افسرده:
اول حساب کنیم که اون 60 درصد چند تا خونه میشه، بعد بصورت تصادفی اون خانه ها رو در آرایه با مقادیر گروه اول پر کنیم.
هر چی خونه خالی موند با مقادیر گروه دوم پر می کنیم.

ثابت size طول آرایه است، فرضا 0 تا 100 میشه 101 خونه.
ثابت percent1 نسبت گروه اول به گروه دومه که میشه 0.60
ثابت های limit هم که مقدار شروع و انتهای بازه قابل قبول در دو گروه رو مشخص می کنند.


private const int size = 101;
private const double percent1 = 0.60;
private const int limitStart1 = 0;
private const int limitFinish1 = 60;
private const int limitStart2 = 61;
private const int limitFinish2 = 100;

private void Form1_Load(object sender, EventArgs e)
{
Random rnd = new Random();
int[] a = new int[size];
bool[] b = new bool[size];
int count1 = (int)((double)size * percent1);
for (int i = 0; i < count1; i++)
{
do
{
int x = rnd.Next(0, size);
if (b[x] == false)
{
b[x] = true;
a[x] = rnd.Next(limitStart1, limitFinish1 + 1);
break;
}
} while (true);
}
for (int i = 0; i < size; i++)
{
if (b[i] == false)
{
a[i] = rnd.Next(limitStart2, limitFinish2 + 1);
}
}


StringBuilder s = new StringBuilder();
for (int i = 0; i < size; i++)
{
s.Append(a[i].ToString() + ", ");
}
MessageBox.Show(s.ToString());
}

omid.mohamadi
جمعه 16 تیر 1391, 23:37 عصر
int rnd=0;
Random R = new Random();
if(R.Next(0,100)<60)
rnd=R.Next(0,60);
else
rnd=R.Next(60,100);

در مثالی که شما خواستید میشد فقط عددی رو بین 0 و 100 به صورت رندم انتخاب کرد و به خودی خود احتمالاتی که شما گفتید درست در میومد،یعنی کد فوق لازم نبود و میشد براحتی نوشت

R.Next(0,100)

برای اینکه قضیه رو بهتر متوجه بشید من بازه رو بین 0و150 در نظر می گیرم و مثلا می خوام احتمال اینکه عددم بین 0 و 50 باشه 80% و احتمال اینکه عددم بین 50 و 150 باشه 20% باشه

int rnd=0;
Random R = new Random();
if(R.Next(0,100)<80)
rnd=R.Next(0,50);
else
rnd=R.Next(50,150);

تعداد اعداد معلومه ، فرضا من میخوام 20عدد تصادفی تولید کنم که فرضا 60% اونها بین 0 تا 60 باشه و 40% اعداد بین 61 تا 100 باشه . خوب این کد در مجموع همچین اعدادی رو برام تولید نمیکنه .
مثلا می تونیم بگیم که => (احتمال/100) * تعداد کل اعداد ، اینطوری تعداد اعداد هر بازه بدست می آد . بعد به تعداد اعداد هر بازه میام اعداد تصادفی در اون بازه تولید می کنیم . اما تو این روش اعداد تولید شده ترتیبشون مشخصه یعنی n تای اول برای بازه اول و m تای بعدی برای بازه بعدی هستن . چطور این اعداد تولید شده رو درهم برهم کنم . یعنی عدد اول ممکنه برای بازه اول باشه یا ممکنه برای بازه دیگری باشه ترتیب شون مشخص نباشه که مال چه بازه ای هستن .

omid.mohamadi
جمعه 16 تیر 1391, 23:47 عصر
اول حساب کنیم که اون 60 درصد چند تا خونه میشه، بعد بصورت تصادفی اون خانه ها رو در آرایه با مقادیر گروه اول پر کنیم.
هر چی خونه خالی موند با مقادیر گروه دوم پر می کنیم.

ثابت size طول آرایه است، فرضا 0 تا 100 میشه 101 خونه.
ثابت percent1 نسبت گروه اول به گروه دومه که میشه 0.60
ثابت های limit هم که مقدار شروع و انتهای بازه قابل قبول در دو گروه رو مشخص می کنند.


private const int size = 101;
private const double percent1 = 0.60;
private const int limitStart1 = 0;
private const int limitFinish1 = 60;
private const int limitStart2 = 61;
private const int limitFinish2 = 100;

private void Form1_Load(object sender, EventArgs e)
{
Random rnd = new Random();
int[] a = new int[size];
bool[] b = new bool[size];
int count1 = (int)((double)size * percent1);
for (int i = 0; i < count1; i++)
{
do
{
int x = rnd.Next(0, size);
if (b[x] == false)
{
b[x] = true;
a[x] = rnd.Next(limitStart1, limitFinish1 + 1);
break;
}
} while (true);
}
for (int i = 0; i < size; i++)
{
if (b[i] == false)
{
a[i] = rnd.Next(limitStart2, limitFinish2 + 1);
}
}


StringBuilder s = new StringBuilder();
for (int i = 0; i < size; i++)
{
s.Append(a[i].ToString() + ", ");
}
MessageBox.Show(s.ToString());
}


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

the king
دوشنبه 19 تیر 1391, 02:26 صبح
روال مثل سابقه، همه گروه ها بجز گروه آخری رو بر حسب نسبت و تعداد اعضاء شون پر می کنیم اما آخرین گروه ته مانده آرایه که خالی
مونده اند رو پر می کنه.

این مثال چهار تا گروه داره، دقت کنید که تعداد عضو های سه آرایه percents و limitStart و limitFinish برابر باشه.


private int size = 101;
private double[] percents = { 0.40, 0.20, 0.10, 0.30 };
private int[] limitStart = { 0, 41, 61, 71 };
private int[] limitFinish = { 40, 60, 70, 100 };

private void Form1_Load(object sender, EventArgs e)
{
Random rnd = new Random();
int[] a = new int[size];
bool[] b = new bool[size];
int j;
for (j = 0; j < percents.Length - 1; j++)
{
int count = (int)((double)size * percents[j]);
for (int i = 0; i < count; i++)
{
do
{
int x = rnd.Next(0, size);
if (b[x] == false)
{
b[x] = true;
a[x] = rnd.Next(limitStart[j], limitFinish[j] + 1);
break;
}
} while (true);
}
}
for (int i = 0; i < size; i++)
{
if (b[i] == false)
{
a[i] = rnd.Next(limitStart[j], limitFinish[j] + 1);
}
}

StringBuilder s = new StringBuilder();
for (int i = 0; i < size; i++)
{
s.Append(a[i].ToString() + ", ");
}
MessageBox.Show(s.ToString());
}