作者liaommx (Orz)
看板C_Sharp
标题[问题] 乱数产生的方式..
时间Sat Feb 27 20:40:18 2010
等等..
看到标题先别觉得奇怪,
这篇文章分成两个部分,
一个是乱数,另一个是判断乱数是否重复.
我google几个长乱数的产生方法,
c#只能产生32长度的乱数,
若要产生在更上去的乱数,就必须用接的方式,
(ex:长度96的乱数,可以用3*32去接)
我今天写了一个程式,希望产生长度为20的HEX乱数(0~9,A~F)
直接产生长度20的乱数比较适合呢?
还是每个digit都产生一个乱数,然後接20次,产生出一个20digit 的乱数比较好?
又第二个问题,
若要判断产生的乱数是否重复.
笔数少的时候还没问题.
但是笔数多的时候不太可能宣告阵列放置乱数.
所以我利用存取文字档的方式,
产生完乱数档案在去判断是否有重复.
但是判断的过程实在很慢(一次产生100万笔资料)
我第一次用的方法,
复制档案,然後第一个档案每次取一行,
然後比对复制档案内的每一行,
所以100万笔资料,比对需耗时100万*100万(while回圈)
比了30分钟,大概只比完2000笔
後来改用比对字元的方式,
只要第一个字元不同就break while回圈
粗略估计约30分钟可以比完5000笔,
还有没有更好的方法可以判断是否有重复资料的产生呢?
或是,有没有甚麽random的方法,
可以完全避免产生乱数资料的重复呢?
PS:就算时间、电脑一样,产生的乱数内容都不一样最好...
不知道有没有这种方法..
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.169.227.244
1F:→ AmosYang:System.Guid 前面自己补零补到 "长度20" ? 02/27 21:44
2F:推 loveme00835:照顺序存入档案再打乱, 交换的顺序随机, 打乱的次数也 02/27 21:55
3F:→ loveme00835:随机, 每次用都是同一个档, 这样就够乱了 02/27 21:55
4F:→ proach:C/C++的话我会边读边排序。1M资料还好,逐笔增加的资料 02/27 22:07
5F:→ proach:并不乱,用binary search之类的方法插入新资料很快。 02/27 22:08
6F:→ proach:C#的List好像有类似函数可用,不用你自己写。 02/27 22:09
7F:推 james732:避免重覆的话...听起来可以用洗牌法? 02/27 22:29
8F:→ liaommx:补充一下,我乱数的形式 02/27 23:01
9F:→ liaommx:20C30880511F533D362824A4BF20EE8EB3ECA1C7 02/27 23:01
11F:→ joefaq:如果是要做加密的话不用自己写 C#有 02/27 23:17
12F:→ liaommx:不是要做加密,而是乱数另有用途,比对是确认我乱数产生 02/27 23:20
13F:→ liaommx:不重复的可信度有多少 02/27 23:20
14F:推 F23ko:好像很有趣 正在试着写写看 02/27 23:38
15F:→ liaommx:有朋友说,为甚麽要丢入档案?丢入阵列不就好了 02/27 23:43
16F:→ liaommx:要看有没有重复,比对阵列比读档快多了... 02/27 23:43
17F:→ liaommx:手边没有VS安装程式..还不能测试.. 02/27 23:44
18F:推 juriolegend:Guid能用到重复..好想中乐透看看XD 02/28 04:49
19F:推 danielguo:等等, Random.NextBytes 可以产生不限长度的乱数呀 02/28 06:24
20F:→ danielguo:20 hex = 10 bytes, 产生 10 bytes 的乱数就行了 02/28 06:26