多线程下产生无重复随机数 产生无重复两位数,在多线程下也能产生无重复 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Just sample...用Queue或Stack可以保证无重复...class Program{ public static void GetRandom(object q) { lock (q) { Console.Write("{0} ", ((Queue<int>)q).Dequeue()); } } static void Main(string[] args) { Queue<int> q = new Queue<int>(); Random rnd = new Random(); byte[] keys = new byte[90]; rnd.NextBytes(keys); int[] items = new int[90]; for (int i = 10; i < 100; i++) { items[i - 10] = i; } Array.Sort(keys, items); foreach (var item in items) { q.Enqueue(item); } Thread t1; Thread t2; Thread t3; for (int i = 0; i < 30; i++) { t1 = new Thread(Program.GetRandom); t1.Start(q); t2 = new Thread(Program.GetRandom); t2.Start(q); t3 = new Thread(Program.GetRandom); t3.Start(q); } }} 先考慮一下單線程時如何產生不重復2位隨機數.產生隨機數的一個簡單辦法是線性同余法:x=(Ax+B)%M顯然生成的隨機數最大周期為M.但是想達到M,A,B不能任意取值,要符合以下條件:1.B,M互质; 2.M的任意质因子可以整除A − 1; 3.若M是4的倍数,A − 1也是; 4.A,B,X都比M小; 5.A,B是正整数由于樓主要求生成2位隨機數,另M=100,此時A=21,B=3即可符合條件.用此算法多線程生成隨機數時,不同線程間要共享變量x,需考慮同步問題.綜上,可得代碼: static void Main(string[] args) { Thread t1 = new Thread(new ThreadStart(GetRandom)); Thread t2 = new Thread(new ThreadStart(GetRandom)); t1.Start(); t2.Start(); } class Random { public int Value = 0; } static Random random=new Random(); static void GetRandom() { lock(random) { while (true) { random.Value = (random.Value * 21 + 3) % 100;//生成隨機數random.Value Console.WriteLine(random.Value);//可以看到,生成的數字在100個以內是不會有重復的. } } } lock(数组){ int a; do { a=生成随机数(); }while(检查是否重复(a)); 将a放入数组;} js中获取数据库中第二级菜单的ID 求助Arralist传值不显示,怎么办啊 怎么才能接受我的更改 C#绘制时钟时出现闪烁,自己试着用双缓冲也没有解决,大家帮忙看看怎么回事,谢谢了! 使用Remoting实现的aop拦截方法,无法改变返回值吗? 怎么用SmtpMail.Send发html网页 菜鸟问一个关于窗口显示的问题! 各位大虾帮忙!!! 再线等(问题解决马上给分)!!!! 如果获取进程主窗口的标题? 请问用c#开发网页脚本,如果不懂asp是不是很麻烦 想搞明白程序 从代码到可运行的原理。 包括 跨平台时不能运行的原因。 c# asp.net 2.0 怎样内嵌qq在线客服
class Program
{
public static void GetRandom(object q)
{
lock (q)
{
Console.Write("{0} ", ((Queue<int>)q).Dequeue());
}
} static void Main(string[] args)
{
Queue<int> q = new Queue<int>(); Random rnd = new Random(); byte[] keys = new byte[90];
rnd.NextBytes(keys);
int[] items = new int[90];
for (int i = 10; i < 100; i++)
{
items[i - 10] = i;
}
Array.Sort(keys, items); foreach (var item in items)
{
q.Enqueue(item);
} Thread t1;
Thread t2;
Thread t3; for (int i = 0; i < 30; i++)
{
t1 = new Thread(Program.GetRandom);
t1.Start(q); t2 = new Thread(Program.GetRandom);
t2.Start(q); t3 = new Thread(Program.GetRandom);
t3.Start(q);
}
}
}
先考慮一下單線程時如何產生不重復2位隨機數.
產生隨機數的一個簡單辦法是線性同余法:x=(Ax+B)%M
顯然生成的隨機數最大周期為M.但是想達到M,A,B不能任意取值,要符合以下條件:
1.B,M互质;
2.M的任意质因子可以整除A − 1;
3.若M是4的倍数,A − 1也是;
4.A,B,X都比M小;
5.A,B是正整数
由于樓主要求生成2位隨機數,另M=100,此時A=21,B=3即可符合條件.
用此算法多線程生成隨機數時,不同線程間要共享變量x,需考慮同步問題.
綜上,可得代碼:
static void Main(string[] args)
{
Thread t1 = new Thread(new ThreadStart(GetRandom));
Thread t2 = new Thread(new ThreadStart(GetRandom));
t1.Start();
t2.Start();
} class Random
{
public int Value = 0;
} static Random random=new Random(); static void GetRandom()
{
lock(random)
{
while (true)
{
random.Value = (random.Value * 21 + 3) % 100;//生成隨機數random.Value
Console.WriteLine(random.Value);//可以看到,生成的數字在100個以內是不會有重復的.
}
}
}
{
int a;
do
{
a=生成随机数();
}while(检查是否重复(a));
将a放入数组;
}