PDA

View Full Version : تولید 2 عدد تصادفی همزمان که مانند هم نباشند



HOSSEINONLINE7
دوشنبه 25 اسفند 1393, 18:52 عصر
سلام من میخوام 2 عدد تصادفی جداگانه همزمان ایجاد کنم که هر کدام در متغیر جداگانه باشند اگر تکراری هم بودند مشکلی نیست ولی مشکل اینجاست که اعداد تولید شده در هر متغیر دقیقا یکیست .

به کد زیر توجه کنید :

Random rand = new Random();

var a = rand.Next(256);

var b = rand.Next(256);

عددهای تصادفی ایجاد شده در متغیر های a,b یکی هست با اینکه جداگانه اجرا میشوند . هر متغیر میتونه عدد تکراری هم تولید کنه ولی نمیخوام هر 2 متغیر شبیه هم باشند . الان دقیقا عدد تولید شده در متغیر a همان هست که همزمان در b ایجاد شده .

اومدم جداگانه از روی کلاس Random نوع ایجاد کردم ولی بازم اعداد تولید شده هر 2 شبیه هم هستن .

vb-sosol
دوشنبه 25 اسفند 1393, 19:19 عصر
http://barnamenevis.org/showthread.php?105142-%D8%AA%D9%88%D9%84%DB%8C%D8%AF-%D8%A7%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AA%D8%B5%D8%A7%D8%AF%D9%81%DB%8C-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE

HOSSEINONLINE7
دوشنبه 25 اسفند 1393, 20:39 عصر
http://barnamenevis.org/showthread.php?105142-%D8%AA%D9%88%D9%84%DB%8C%D8%AF-%D8%A7%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AA%D8%B5%D8%A7%D8%AF%D9%81%DB%8C-%D8%AF%D8%B1-%D8%B3%DB%8C-%D8%B4%D8%A7%D8%B1%D9%BE

مرسی
از مطالب تاپیک این کد زیر به کارم میاد به شرط اینکه بشه براش بازه تعریف کرد که مثلا بین 0 تا 20 عدد تصادفی تولید کنه .


byte[] randomNumber = new byte[1];
System.Security.Cryptography.RNGCryptoServiceProvi der.Create().GetBytes(randomNumber);
MessageBox.Show("Random Number : " + randomNumber[0].ToString());

rahnema1
سه شنبه 26 اسفند 1393, 06:26 صبح
سلام
این شکلی هم میشه نوشت

Random rand = new Random();

var a = rand.Next(256);

var b = rand.Next(255);
if ( b >= a)
b++;

elec60
سه شنبه 26 اسفند 1393, 07:13 صبح
کلاس Random از system time به عنوان seed استفاده می کنه و اگه از یک object این کلاس به طور متوالی استفاده بشه به دلیل سرعت بالای اجرا دو خط متوالی عملا seed و نتیجه یکسان می شه

یا با یه تاخیری باید دومین Next رو اجرا کنین و یا از دو کلاس مختلف Random استفاده کنین

elec60
سه شنبه 26 اسفند 1393, 07:14 صبح
سلام
این شکلی هم میشه نوشت

Random rand = new Random();

var a = rand.Next(256);

var b = rand.Next(255);
if ( b >= a)
b++;


این کار شما یجور کلا شرعی محسوب میشه چرا که اصلا مفهوم مستقل بودن دو متغیر تصادفی رو زیر سوال میبره

HOSSEINONLINE7
سه شنبه 26 اسفند 1393, 10:23 صبح
کلاس Random از system time به عنوان seed استفاده می کنه و اگه از یک object این کلاس به طور متوالی استفاده بشه به دلیل سرعت بالای اجرا دو خط متوالی عملا seed و نتیجه یکسان می شه

یا با یه تاخیری باید دومین Next رو اجرا کنین و یا از دو کلاس مختلف Random استفاده کنین

من نمیدونم دیگه چطور استفاده کنم . هرروشی رفتم هر 2 مثل هم ایجاد میشن . اومدم 2 کلاس مختلف ایجاد کردم و متد های Random را جداگانه نوشتم . بعد توی فرم اصلی جداگانه ازشون نمونه ساختم و استفاده کردم بازم مثل هم شد !

کلاس متفاوت دیگه برای این کار چی هست که بشه براش بازه هم تعریف کرد که بین یک محدوده عدد تولید بشه ؟


این کار شما یجور کلا شرعی محسوب میشه چرا که اصلا مفهوم مستقل بودن دو متغیر تصادفی رو زیر سوال میبره

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

rahnema1
سه شنبه 26 اسفند 1393, 10:59 صبح
این کار شما یجور کلا شرعی محسوب میشه چرا که اصلا مفهوم مستقل بودن دو متغیر تصادفی رو زیر سوال میبره

اتفاقا دوستمون هم میخواستند مستقل نباشند. یه بار دیگه سوالشون را بخونید گفتند می خواهند دو متغیر هیچ وقت مقادیرشون مثل هم نشه.
این یعنی چی؟ یعنی اینکه اگه واسه اولی یک عدد انتخاب شد دومی تمام اعداد رندوم را می تونه بپذیره غیر از عددی که مربوط به اولی می شه. من هم همین کار را کردم. کجاش کلاه شرعی بود؟؟

rahnema1
سه شنبه 26 اسفند 1393, 11:21 صبح
کلاس Random از system time به عنوان seed استفاده می کنه و اگه از یک object این کلاس به طور متوالی استفاده بشه به دلیل سرعت بالای اجرا دو خط متوالی عملا seed و نتیجه یکسان می شه

یا با یه تاخیری باید دومین Next رو اجرا کنین و یا از دو کلاس مختلف Random استفاده کنین

لزومی نداره با تاخیر اجرا بشن. ما فقط یکبار شیء rand را ایجاد می کنیم و هر چه تعداد بخواهیم و بدون هیچ تاخیری می تونیم عدد رندوم درست کنیم. در واقع در سی شارپ ضمانت شده که ترتیب مقدار دهی اولیه در فیلد ها یا متغیر های محلی حفظ بشه.
علت اینکه نتایج ممکنه یکسان بیاد اینه که چون عدد به اصطلاح ،تصادفیه تصادفا ممکنه نتایج یکی بشه. و این احتمال زمانی بیشتر میشه که دامنه مقادیری که لازمه به طور تصادفی ازشون انتخاب بشه کم باشه مثلا اینجا که 256 هست

msg.wizard
سه شنبه 26 اسفند 1393, 13:36 عصر
از این کد ها استفاده کن



byte[] g1 = Guid.NewGuid().ToByteArray();
byte[] g2 = Guid.NewGuid().ToByteArray();
int a = BitConverter.ToInt32(g1, 4);
int b = BitConverter.ToInt32(g2, 4);
b = b % 255;
a = a%255;

rahnema1
چهارشنبه 27 اسفند 1393, 11:25 صبح
از این کد ها استفاده کن



byte[] g1 = Guid.NewGuid().ToByteArray();
byte[] g2 = Guid.NewGuid().ToByteArray();
int a = BitConverter.ToInt32(g1, 4);
int b = BitConverter.ToInt32(g2, 4);
b = b % 255;
a = a%255;


توجه ! در این روش ممکنه a و b یکسان بشن. هیچ ضمانتی نیست که یکسان نشوند!

MehdiElexal
چهارشنبه 27 اسفند 1393, 13:08 عصر
Random rand = new Random();
var a = rand.Next(256);
var b = rand.Next(256);
if ( b == a)
var b = rand.Next(255);

HOSSEINONLINE7
چهارشنبه 27 اسفند 1393, 13:12 عصر
توجه ! در این روش ممکنه a و b یکسان بشن. هیچ ضمانتی نیست که یکسان نشوند!

خوب اینش را دیگه باید با شرط چک کرد .

با این کد مشکل من حل شد . تکراری بودن a,b گاهی وقتا مشکلی نیست . درواقع مشکل من این بود که اعداد تصادفی ایجاد شده اون موقع 100٪ یکی بودن ولی با این کد گاهی وقتا شاید یکی بشن که موردی نداره .

MehdiElexal
چهارشنبه 27 اسفند 1393, 13:18 عصر
امکان نداره در روش پیشنهادی بنده دو عدد یکسان بشن ! شرط برای همینه
اگر مساوی باشه مجدد انجام میده

elec60
چهارشنبه 27 اسفند 1393, 14:21 عصر
Random rnd = new Random();
int random_number1 = rnd.Next(10);
int random_number2 = rnd.Next(10);
while (random_number2 == random_number1)
{
random_number2 = rnd.Next(10);
}
Console.WriteLine(random_number1);
Console.WriteLine(random_number2);

rahnema1
چهارشنبه 27 اسفند 1393, 20:14 عصر
Random rand = new Random();
var a = rand.Next(256);
var b = rand.Next(256);
if ( b == a)
var b = rand.Next(255);


خب لازمه یه حلقه بذارید که هی مرتب چک کنه که این دو برابرند یا نه که حلقه هزینه داره

rahnema1
چهارشنبه 27 اسفند 1393, 20:19 عصر
خوب اینش را دیگه باید با شرط چک کرد .

با این کد مشکل من حل شد . تکراری بودن a,b گاهی وقتا مشکلی نیست . درواقع مشکل من این بود که اعداد تصادفی ایجاد شده اون موقع 100٪ یکی بودن ولی با این کد گاهی وقتا شاید یکی بشن که موردی نداره .

ببینید این کدی که شما گذاشتید که 256 به عنوان ورودی هست :

Random rand = new Random();

var a = rand.Next(256);

var b = rand.Next(256);

مطمئن باشید به احتمال 99 درصد عددهای a و b متفاوت خواهند بود
احتمالا شما مثلا اینجور نوشتید که جواب همیشه یکسان میشه ( به علت سرعت):


var a = new Random().Next(256);

var b = new Random().Next(256);

Abbas Naghdi
چهارشنبه 27 اسفند 1393, 20:33 عصر
یکی از قدرتمند ترین الگوریتم ها ... تو مسابقات سال 92 به کار بردم ... در یک ملیونیم ثانیه هم تکراری ازش بیرون نمیاد ...
فایل رو پیوست کردم ... به دلایلی سورس کامل رو نمیتونم بزارم فقط کد اصلی و فایل اجرایی ...

rahnema1
چهارشنبه 27 اسفند 1393, 20:51 عصر
یکی از قدرتمند ترین الگوریتم ها ... تو مسابقات سال 92 به کار بردم ... در یک ملیونیم ثانیه هم تکراری ازش بیرون نمیاد ...
فایل رو پیوست کردم ... به دلایلی سورس کامل رو نمیتونم بزارم فقط کد اصلی و فایل اجرایی ...

مشکل با الگوریتم نیست. اینجا که قرار بین 0 تا 255 دو تا عدد انتخاب بشه احتمال اینکه همزمان دو عدد یکسان بیاد دقیقا میشه 0.39062 درصد و احتمال اینکه دو عدد متفاوت باشند میشه 99.60938 درصد
که تفاوت الگوریتمها تاثیر چندانی در نتیجه نداره همون طور که در پست شماره 4 اشاره کردم لازم بود با کمترین هزینه دوعدد تصادفی ایجاد بشه که هیچ وقت با هم برابر نیستند که با امکانات معمولی سی شارپ این کار به خوبی امکان پذیره