多线程下产生无重复随机数

applewar007 2009-04-29 10:13:44
产生无重复两位数,在多线程下也能产生无重复
...全文
287 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
socg 2009-05-05
  • 打赏
  • 举报
回复
lock(数组)
{
int a;
do
{
a=生成随机数();
}while(检查是否重复(a));
将a放入数组;
}


applewar007 2009-05-05
  • 打赏
  • 举报
回复
顶下
ProjectDD 2009-04-30
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 vrhero 的回复:]
Just sample...用Queue或Stack可以保证无重复...

C# codeclass 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]…
[/Quote]

能不能解释一下,你这段代码的用意.. 学习一下;
E_wait 2009-04-30
  • 打赏
  • 举报
回复
建立一个存储所产生随机数的空间,保证该空间这些线程都能访问.
然后在产生随机数时判断空间是否已经有该数,有则重新生成,无则添加进去.
不过这要考虑到并发问题,使用锁机制来确保正确性
lfywy 2009-04-30
  • 打赏
  • 举报
回复
学习
justin麒麟 2009-04-30
  • 打赏
  • 举报
回复
2位的不重复数?多线程?99个不重复的内容?能在说的明白点吗?
applewar007 2009-04-30
  • 打赏
  • 举报
回复
最好带些代码看下,清楚点
xuwu1010 2009-04-30
  • 打赏
  • 举报
回复
设置随机种子试试
a013231 2009-04-29
  • 打赏
  • 举报
回复

先考慮一下單線程時如何產生不重復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個以內是不會有重復的.
}
}
}
vrhero 2009-04-29
  • 打赏
  • 举报
回复
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);
}
}
}
春天的气息 2009-04-29
  • 打赏
  • 举报
回复
哦,给个产生的随机数×整数段,要做处理的,不然的话会复杂,

估计是1/2000的重复率。
ProjectDD 2009-04-29
  • 打赏
  • 举报
回复
可能有难度,还得想想,关键是你这个规则还象还欠点什么...把规则想全可以写个测试什么的,来试试.
蓝海D鱼 2009-04-29
  • 打赏
  • 举报
回复
mark

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧