السلام عليكــم ورحمـة الله وبركاتــه
اخباركم شباب
ممكن مساعدة يا اخوان
انا لدي كود هذه اخوارزمية
وهي لتوليد ارقام بين الت 0 , الى n بدون تكرار , يعني اولد كل مرة رقم عشوائي ضمن هذا المجال اذا طلبت n رقم سيعطيني كل مرة رقم يستحيل تكراره
وطبعا اعتمادا على البذرة seed بحيث استطيع استرجاع نفس التسلسل في كل مرة
انا سويته وجربته لكن المشكلة كان يشتغل وما شاء الله عليه , فجأة بطل ينفع !!!!!!!
لمعلومات اكثر
http://en.wikipedia.org/wiki/Linear_congruential_generator
الكود هو
كود
class LCG
{
public int C;
public int A;
int Generator = 0;
//*******************************************************
public int[] Prime_Numbers = new int[301];
//*******************************************************
private bool Prime(int x)
{
int i;
for (i = x - 1; i >= 2; --i)
{
if (x % i == 0)
{
break;
}
}
if (i < 2)
{
return true;
}
else
{
return false;
}
}
//*******************************************************
public int Find_Constant(int n)
{
int i;
for (i = n; i >= 2; --i)
{
if (n % i != 0)
{
break;
}
}
return i;
}
//*******************************************************
private bool IsMultiple(int x)
{
int i;
bool Multiple = true;
for (i = 0; i < 300; i++)
{
if (Prime_Numbers[i] != 0)
{
if (x % Prime_Numbers[i] != 0)
{
Multiple = false;
break;
}
}
}
return Multiple;
}
//*******************************************************
public int Find_A(int n)
{
int i;
for (i = 1; i <= 10000; i++)
{
if (IsMultiple(i))
{
if (n % 4 == 0)
{
if (i % 4 == 0)
{
break;
}
}
else
{
break;
}
}
}
return i + 1;
}
//*******************************************************
private void Find_Prime_Numbers(int n)
{
int i;
int j;
j = 1;
for (i = n; i >= 1; i--)
{
if ((Prime(i)) && (n % i == 0))
{
Prime_Numbers[j] = i;
j = j + 1;
}
}
}
//*******************************************************
public int flag = 0;
public int NC;
public int NA;
public int Random_LCG(int n, int Seed)
{
if (Generator == 0)
{
C = Find_Constant(n);
Find_Prime_Numbers(n);
A = Find_A(n);
Generator = 1;
}
if (flag == 0)
{
NC = C;
NA = A;
flag = 1;
}
return (A * Seed + C) % n;
}
//*******************************************************
}
}
{
public int C;
public int A;
int Generator = 0;
//*******************************************************
public int[] Prime_Numbers = new int[301];
//*******************************************************
private bool Prime(int x)
{
int i;
for (i = x - 1; i >= 2; --i)
{
if (x % i == 0)
{
break;
}
}
if (i < 2)
{
return true;
}
else
{
return false;
}
}
//*******************************************************
public int Find_Constant(int n)
{
int i;
for (i = n; i >= 2; --i)
{
if (n % i != 0)
{
break;
}
}
return i;
}
//*******************************************************
private bool IsMultiple(int x)
{
int i;
bool Multiple = true;
for (i = 0; i < 300; i++)
{
if (Prime_Numbers[i] != 0)
{
if (x % Prime_Numbers[i] != 0)
{
Multiple = false;
break;
}
}
}
return Multiple;
}
//*******************************************************
public int Find_A(int n)
{
int i;
for (i = 1; i <= 10000; i++)
{
if (IsMultiple(i))
{
if (n % 4 == 0)
{
if (i % 4 == 0)
{
break;
}
}
else
{
break;
}
}
}
return i + 1;
}
//*******************************************************
private void Find_Prime_Numbers(int n)
{
int i;
int j;
j = 1;
for (i = n; i >= 1; i--)
{
if ((Prime(i)) && (n % i == 0))
{
Prime_Numbers[j] = i;
j = j + 1;
}
}
}
//*******************************************************
public int flag = 0;
public int NC;
public int NA;
public int Random_LCG(int n, int Seed)
{
if (Generator == 0)
{
C = Find_Constant(n);
Find_Prime_Numbers(n);
A = Find_A(n);
Generator = 1;
}
if (flag == 0)
{
NC = C;
NA = A;
flag = 1;
}
return (A * Seed + C) % n;
}
//*******************************************************
}
}
لاستخدامه مثلا
ادرج صندوقين كتابة textbox1 هو الـ seed
و textBox2 هو اللي تحط فيه اكبر رقم ممكن يعني n وطبعا هذا الكود يدرج في الليست الارقام ,
وضع هذا الكود :
كود
listBox1.Items.Clear();
int Seed = int.Parse(textBox1.Text.ToString());
LCG RD = new LCG();
int Temp = int.Parse(textBox2.Text.ToString());
while (Temp >= 1)
{
Seed = RD.Random_LCG(Temp, Seed);
listBox1.Items.Add(Seed);
Temp--;
}
RD.flag = 0;
int Seed = int.Parse(textBox1.Text.ToString());
LCG RD = new LCG();
int Temp = int.Parse(textBox2.Text.ToString());
while (Temp >= 1)
{
Seed = RD.Random_LCG(Temp, Seed);
listBox1.Items.Add(Seed);
Temp--;
}
RD.flag = 0;
ما الحل اسعفوني
الامر يتعلق بشيء يخص مشروع تخرج مش مزحه
ملاحظة
اللي عنده الكود مفهوم بدون تعقيد على لغة اخرى ارجوا اعطائي اياه