请问如何生成10位永不重复的随机数?

callmesai 2010-09-17 02:21:07
请给个思路~谢谢~
...全文
2060 44 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
44 条回复
切换为时间正序
请发表友善的回复…
发表回复
足球中国 2010-09-18
  • 打赏
  • 举报
回复
从1加10位才要多久啊。哪有不重复的。
弄个64位吧。
widiandian 2010-09-18
  • 打赏
  • 举报
回复
都人才,汗,我估计楼主是想取数的时候和以前出的数比对,不重复吧
delacrxoix_xu 2010-09-18
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 tcjiaan 的回复:]
生成一个,记录一个,在生成下一个之后,再去查找是否重复。
[/Quote]

存储这些密码,需要很大的存储空间,10位,是10个字节,最多有10的10次方个密码,大概需要100G的存储空间。当生成的密码数量不多的时候,遍历比较还是比较快的,但是越来越慢,越来越慢,
也就是说你最后几次比较的时候,遍历整个密码库,就需要访问100G的数据,100G的数据,放到内存是不现实的,要是放到磁盘上。。。。。这个速度,恐怕有点像蜗牛,总的来说,最后几个密码,必然需要大概1个小时才能生成一个新密码。
delacrxoix_xu 2010-09-18
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 callmesai 的回复:]
我的思路是前6位使用随机数~后4位使用时间加密~这样可以实现永不重复吗?
[/Quote]

不行 ,道理是一样的。10位总是有限的,我要是生成了 10000000000 + 1 个密码,必然至少有两个是重复的。 这是鸽巢原理。 就像三个苹果放到两个抽屉里,必然有至少一个抽屉里有至少两个苹果。
delacrxoix_xu 2010-09-18
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 bourbon1795 的回复:]
永不重复是假命题。
[/Quote]

恩。。。可以用《组合数学》中的鸽巢原理来解释
bourbon1795 2010-09-18
  • 打赏
  • 举报
回复
永不重复是假命题。
jianqifeihong 2010-09-18
  • 打赏
  • 举报
回复 1
如果楼主生成随机数的目的是不让记录重复,那就可以不用随机数啊,用一个uint从0开始递增啊,怎么也不重复,十位也够了
无语中V5 2010-09-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 benyouyong 的回复:]
引用 2 楼 gauzeapricot122 的回复:
没听明白


我也没明白.
是10位数的每位都不重复呢?
还是每次生成德都不重复?
[/Quote]希望楼主的见解
Teng_s2000 2010-09-18
  • 打赏
  • 举报
回复
feixuyue 2010-09-18
  • 打赏
  • 举报
回复
list<int> l;
for (i=1000000000,i++,i<10000000000)
l.add(i);
Random random = new Random();
int randomNumber = random.Next(l.Count);
int get=l(randomNumber);
l.RemoveAt(randomNumber);
qqzeng-ip 2010-09-17
  • 打赏
  • 举报
回复
//从1,50随机20个不重复数
public int[] GetRandomUnrepeatArray(int minValue, int maxValue, int count)
{
Random rnd = new Random();
int length = maxValue - minValue + 1;
byte[] keys = new byte[length];
rnd.NextBytes(keys);
int[] items = new int[length];
for (int i = 0; i < length; i++)
{
items[i] = i + minValue;
}
Array.Sort(keys, items);
int[] result = new int[count];
Array.Copy(items, result, count);
return result;
}

调用:
int[] a= GetRandomUnrepeatArray(1,100,20);
for (int i = 0; i < a.Length; i++)
{
Response.Write(a[i].ToString()+",");
}
//结果:27,34,44,19,30,67,58,18,26,57,62,16,8,91,100,31,56,85,88,29



http://www.cnblogs.com/zengxiangzhan/archive/2009/10/31/1593642.html
chenketang 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 lin2yatou 的回复:]
可以每生成一次就记录一次,有重复的,重新随机
[/Quote]顶
love_yuan_feng 2010-09-17
  • 打赏
  • 举报
回复
ArrayList al = new ArrayList();
for (int i = 0; i < 10; i++)
al.Add(i);
Random rd = new Random();
while (al.Count > 0)
{
int index = rd.Next(al.Count);
Console.Write(al[index].ToString() + " ");
al.RemoveAt(index);
}
Console.Read();
东邪独孤 2010-09-17
  • 打赏
  • 举报
回复
生成一个,记录一个,在生成下一个之后,再去查找是否重复。
wj0728 2010-09-17
  • 打赏
  • 举报
回复
NB人物
牛叔 2010-09-17
  • 打赏
  • 举报
回复
永不重复,永远有多远?
理论上说,你总会重复的。。。。
  • 打赏
  • 举报
回复
MD5 .. 难道生成一个就保存一个,然后从随机的数字中排除?不过10位也才百亿级别。处理的过来的。。
callmesai 2010-09-17
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 jimh 的回复:]
上面都说了,不可能不重复,只是重复的概率有多大,假设我们的程序生命周期有10年,那保证10年以内不重复就可以了,如果用时间加密,4位时间显然是不够的,我看就用guid,从中间取10位好了。
[/Quote]
guid截取后仍然不重复?
jimh 2010-09-17
  • 打赏
  • 举报
回复
上面都说了,不可能不重复,只是重复的概率有多大,假设我们的程序生命周期有10年,那保证10年以内不重复就可以了,如果用时间加密,4位时间显然是不够的,我看就用guid,从中间取10位好了。
callmesai 2010-09-17
  • 打赏
  • 举报
回复
我的思路是前6位使用随机数~后4位使用时间加密~这样可以实现永不重复吗?
加载更多回复(23)

111,094

社区成员

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

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

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