واضح آرشیو وب فارسی:سایت ریسک: یک سوال در رابطه با سی شارپ: تولید اعداد تصادفی دوستی 20 آذر 1388, 21:49سلامممم:) پس از مدت ها دوباره اومدیم البته این دفعه از پی اچ پی کوچ کردیم به سی شارپ:green: دوستان من میخوام یه آرایه که دارم با یه حلقه به صورت تصادفی توی 8 تا خونش 1 بذارم. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { int[,] inta = new int[8,8]; int[,] intb = new int[8, 2]; public Form1() { InitializeComponent(); } //custome class private int RandomNumber(int min, int max) { Random random = new Random(DateTime.Now.Millisecond); return random.Next(min,max); } private int RandomNumber2(int min, int max) { Random random = new Random(); return random.Next(min, max); // // } //end of custome class private void Form1_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { //Int32 n = Int32.Parse(textBox1.Text); RandomNumber2(1, 8); for (int i = 0; i < 8; i++) { label1.Text = label1.Text + " "; for (int i2 = 0; i2 < 8; i2++) { label1.Text = label1.Text +" "+ inta[i, i2].ToString(); } } label1.Text = label1.Text +" "; for (int i = 0; i < 8; i++) { Random random = new Random(DateTime.Now.Millisecond); Random random2 = new Random(); inta[(int)random.Next(1,10-2), random2.Next(1, 8)] = 1; } ولی نمیشه! اون عدد تصادفی هر دفعه فقط یه مقدار میده. یعنی هربار هشت دفعه یه خونه 1 میشه در حالی که میخوام تو همون یه دفعه 8تا خونه تصادفی یک بشه. هر بلایی سرش آوردم نشد.:-? در ضمن من مبتدی هستم. لطفا راهنمایی بفرمایید ممنون the_king 21 آذر 1388, 01:59پنج تا اشکال در کد تان می بینم : 1) شما ایجاد کردن شی از کلاس Random را در داخل حلقه نوشته اید، به همین جهت برای هر کدام از اعداد تصادفی تولید شده مجددا یک شی از کلاس Random ایجاد می شود که زمان سپری شده از ایجاد شی قبلی فوق العاده کم است، بدیهی است که Seed ای که بر حسب زمان ایجاد می شود در این فاصله کوتاه ممکن است تغییری نکند. نیازی نیست که برای هر عدد تصادفی مجددا شیء ایجاد شود، یک شیء از نوع Random بسازید و تا انتهای برنامه از همان یک نمونه استفاده کنید. 2) کد های داخل یک حلقه ساده for که از 0 الی 7 را می شمارد کمتر از یک میلی ثانیه طول می کشد، بنابر این ایجاد کردن اعداد تصادفی بر اساس DateTime.Now.Millisecond قطعا منجر به انتخاب Seed های تکراری خواهد شد. بهتر است که برای ایجاد کردن شی از نوع Random از هیچ پارامتری استفاده نکنید، خودش بطور پیشفرض Seed را بر اساس زمان با دقت فوق العاده بیشتری از میلی ثانیه ایجاد خواهد کرد. 3) حلقه نمایش مقادیر اندیس های آرایه در label1 قبل از حلقه قرار دادن مقادیر 1 در آرایه اجرا می شود، چرا کد آنرا بالاتر نوشتید؟ 4) شماره اندیس های آرایه [8,8] از 0 الی 7 هستند، در حالی که تابع عدد تصادفی (random2.Next(1, 8 عددی بین 1 و 7 را بر می گرداند (عدد تصادفی x بزرگتر یا مساوی min و کوچکتر از max خواهد بود). 5) چک نکردید که اگر زوج اعداد تصادفی [x, y] ایجاد شده تکراری بود، زوج اعداد تصادفی دیگری انتخاب نماید. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { int[,] inta = new int[8, 8]; Random random = new Random(); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { int x, y; for (int i = 0; i < 8; i++) { do { x = random.Next(0, 8); y = random.Next(0, 8); } while (inta[x, y] == 1); inta[x, y] = 1; } for (int i = 0; i < 8; i++) { label1.Text = label1.Text + " "; for (int i2 = 0; i2 < 8; i2++) { label1.Text = label1.Text + " " + inta[i, i2].ToString(); } } label1.Text = label1.Text + " "; } } }
این صفحه را در گوگل محبوب کنید
[ارسال شده از: سایت ریسک]
[مشاهده در: www.ri3k.eu]
[تعداد بازديد از اين مطلب: 3729]