PDA

View Full Version : سوال: ایجاد کدهای یک تا بیش از 15 ملیون



pamenary
یک شنبه 08 تیر 1393, 18:34 عصر
سلام
من یه کد نوشتم که کد یکتا تولید می کنه برای تولید زیر 1 ملیون خوب عمل می کنه ولی این نرم افزار بالای 15 ملیون حداقل احتیاج داره که کد تولید کنه
مشکل اینه که خیلی زمان بر الان بیش از 6 ساعت طول کشیده هنوز خبری نیست پیشنهادتون چیه؟
لطفاً راهنمایی کنید
اینم کد

int i, j, arr_count, number, code_length, min, max;

//گرفتن تعداد کل کدهایی که باید ساخته شود
int total = Convert.ToInt32(txt_count.Text);



code_length = Convert.ToInt32(txt_length.Value);

Random r = new Random();
//ایجاد آرایه
int[] arr_numbers = new int[total];



//حداقل
string min_2 = new String('0', code_length - 1);
min = Convert.ToInt32(1 + min_2);

//حداکثر
string max_2 = new String('9', code_length - 1);
max = Convert.ToInt32(9 + max_2);



arr_count = Convert.ToInt32(arr_numbers.Count());
for (i = 0; i <= total; i++)
{
for (j = 0; j < arr_count; j++)
{


number = r.Next(min,max);
if (arr_numbers[j] != number)
{
arr_numbers[j] = number;
}

}

}

/*
string str = "";
for (i = 0; i < total; i++)
{
str = str + arr_numbers[i].ToString() + ";";

}
Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.ApplicationClass();
str = str.Remove(str.Length - 1);

if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
//MessageBox.Show(saveFileDialog1.FileName);
System.IO.File.WriteAllText(saveFileDialog1.FileNa me, str);

}

*/

elec60
یک شنبه 08 تیر 1393, 19:06 عصر
بنظر میرسه منطقی که نوشتی درست نباشه. تو for درونی برای j از ۰ تا arr_count آرایه arr_numbers پر میشه چون مقدار اولیه این آرایه صفره و number صفر نمیشه(اگه min بیشتر از صفر باشه) پس تو iteration اول این آرایه پر میشه و از i مساوی ۱ تا total زائده.

pamenary
یک شنبه 08 تیر 1393, 19:34 عصر
بنظر میرسه منطقی که نوشتی درست نباشه. تو for درونی برای j از ۰ تا arr_count آرایه arr_numbers پر میشه چون مقدار اولیه این آرایه صفره و number صفر نمیشه(اگه min بیشتر از صفر باشه) پس تو iteration اول این آرایه پر میشه و از i مساوی ۱ تا total زائده.
مرسی از وقتی که گذاشتی ولی درست for اولی برای تعداد کدهایی که لازم و for دومی برای چک کردن آرایه از ابتدا برای تکراری نبودن کد به هیمن خاطر خیلی زمان گیر چون برای هر کد باید از ابتدا تا مثلا 15 میلیون کد چک کنه که تکراری هست یا خیر

MiniMicro
یک شنبه 08 تیر 1393, 20:10 عصر
سلام به نظر من از ترد ها استفاده کنید خیلی بهتره....

rahnema1
یک شنبه 08 تیر 1393, 21:00 عصر
کسی نیست راهنمایی کنه؟؟؟؟؟؟؟؟؟

این کد از اعداد 1 تا 10 تولید کرده و ترتیب اونها را به صورت تصادفی به هم می زنه حالا شما می تونید دامنه اعداد را زیاد یا کم کنید

using System.Linq;
//...
Random r = new Random();
int[] rnd=Enumerable.Range(1,10).Select(x=> new{val=x,srt= r.Next()})
.OrderBy(y=> y.srt).Select(x=> x.val).ToArray();

elec60
یک شنبه 08 تیر 1393, 21:16 عصر
مرسی از وقتی که گذاشتی ولی درست for اولی برای تعداد کدهایی که لازم و for دومی برای چک کردن آرایه از ابتدا برای تکراری نبودن کد به هیمن خاطر خیلی زمان گیر چون برای هر کد باید از ابتدا تا مثلا 15 میلیون کد چک کنه که تکراری هست یا خیر

for اول تو تعدا کدها هیچ تاثیری نداره! شرطی هم که تو for داخلی گذاشتین تضمین نمیکنه که اعداد داخل ارایه تکراری نباشن!

pamenary
یک شنبه 08 تیر 1393, 22:12 عصر
برنامه تغییر دادم سرعتش خیلی خیلی بهتر شد ولی با این حال بازم زیاده
چطور از نخ ها استفاده کنم

Random random = new Random();
HashSet<string> ids = new HashSet<string>();
StringBuilder sb = new StringBuilder();
while (ids.Count < total)
{



ids.Add(GenerateNumber(min , max , code_length));


}

elec60
یک شنبه 08 تیر 1393, 22:24 عصر
برنامه تغییر دادم سرعتش خیلی خیلی بهتر شد ولی با این حال بازم زیاده
چطور از نخ ها استفاده کنم

Random random = new Random();
HashSet<string> ids = new HashSet<string>();
StringBuilder sb = new StringBuilder();
while (ids.Count < total)
{



ids.Add(GenerateNumber(min , max , code_length));


}

بجای استفاده از thread از asynchronous programming استفاده کن. تو کتاب جوزف البهاری یه فصل داره که Parallel Programming رو کامل شرح داده، اگه کتابو خواستی ایمیل بده ارسال کنم