首页 新闻 会员 周边 捐助

C#不重复或者重复几率很小的随机数

0
悬赏园豆:100 [已解决问题] 解决于 2016-05-26 17:18

各位大牛,请教一下:

我需要生成8位随机数字作为主键  怎样才能不让它重复或者说重复几率很小。

可以给下可运行代码和注释么,本人菜鸟一个

 谢谢!!!

ly丶乐的主页 ly丶乐 | 初学一级 | 园豆:14
提问于:2016-05-26 16:23
< >
分享
最佳答案
1

做主键的随机数唯一可以用的就是guid.8位数字就别想了.你的表最多只能有1000w行数据.

你直接生成0到999999999之间的随机数.拿来用不就是了.至于不重复.你都主键了还想什么不重复..重复了他直接报异常了.你重新插就是.

收获园豆:30
吴瑞祥 | 高人七级 |园豆:29449 | 2016-05-26 16:36

不是一億嗎?我算錯了? 

RosonJ | 园豆:4910 (老鸟四级) | 2016-05-26 16:40

   想想也是....

ly丶乐 | 园豆:14 (初学一级) | 2016-05-26 17:20
其他回答(8)
0

只能數字又不要重複,為何不用流水號,何必隨機

收获园豆:15
RosonJ | 园豆:4910 (老鸟四级) | 2016-05-26 16:28

我一开始也是这么想的,但是不行啊,上面要求必须随机......我没法子

支持(0) 反对(0) ly丶乐 | 园豆:14 (初学一级) | 2016-05-26 16:29

@ly丶乐: 

8位數也才一億種組合,重複機率就這樣,重複處裡勢必得做,用Random吧

支持(1) 反对(0) RosonJ | 园豆:4910 (老鸟四级) | 2016-05-26 16:33

@RosonJ: 我用的就是Random 但是测试的时候重复一堆 不忍直视了 ...... 

支持(0) 反对(0) ly丶乐 | 园豆:14 (初学一级) | 2016-05-26 16:35

@ly丶乐: 

我只能說,一億種組合就已經限制你的機率,重複率最就是第一筆(0/一億),之後重複率勢必越來越大,這是機率的問題,不是你糾結用什麼隨機機制能解決的

支持(0) 反对(0) RosonJ | 园豆:4910 (老鸟四级) | 2016-05-26 16:39

@RosonJ: 谢谢了  我算是知道我这没法玩了  

支持(0) 反对(0) ly丶乐 | 园豆:14 (初学一级) | 2016-05-26 17:18
1

初始化一个集合,1亿个数字。每次请求randown.next(0,arr.length)随机取集合中的数字,取完删除。

反正1亿个数字内存也没多少,然后取出来的数字可以存数据库呀,本地文件呀。程序重启之后也能正常使用

 

话说,你这个需求蛮奇葩的

收获园豆:20
czd890 | 园豆:14488 (专家六级) | 2016-05-26 16:40

谢谢咯.......

支持(0) 反对(0) ly丶乐 | 园豆:14 (初学一级) | 2016-05-26 17:19
0

Random的实现已经很好了

你可以研究下洗牌算法,然后把洗好的牌保存好,一个一个去取,取出来的结果看着就是随机的,而且还不会重复!

收获园豆:20
刘宏玺 | 园豆:14020 (专家六级) | 2016-05-26 16:45

我去研究研究,谢了

支持(0) 反对(0) ly丶乐 | 园豆:14 (初学一级) | 2016-05-26 17:19
0

建议使用GUID或者是时间戳

如果非要是随机数的话,需要将已生成的随机数排除掉

收获园豆:15
CodeHsu | 园豆:5668 (大侠五级) | 2016-05-26 17:04

  我已经放弃了

支持(0) 反对(0) ly丶乐 | 园豆:14 (初学一级) | 2016-05-26 17:20
0

var maxNum = 1000000;
var randomNum = GuidUtil.GetGuid().GetHashCode() % maxNum;
给你答案吧  .net 自带的Random在单位时间里面获取的值是一样的 所以会有很多重复的 用guid的hashcode来处理

Random最好不用 会有性能坑

qisheng722 | 园豆:92 (初学一级) | 2016-05-27 16:34
0

可以试试时间戳

中本傻 | 园豆:167 (初学一级) | 2016-05-29 15:31
0

你说的一大堆重复的 是偶尔有几个重复的,还是一长串都是重复的。

C#随机数是伪随机,间隔时间过短 会产生重复数字(例如写在循环里,得通过一些技巧来避免这样的重复数字)。

既然是自己生成的主键,可以在插入前 先去数据库查一下是否存在,不存在就插入,存在就重新生成再查找。

从今天开始 | 园豆:244 (菜鸟二级) | 2016-05-30 17:22
0

这个很好实现,比如你要取10(举例,可以是任意N)个随机数:

a:分配大小为10的数组并赋值1-10

b:随机(1,10),比如5,替换5和最后一个,此时5在最后

c:再随机(1,9)(每次减一),比如8,替换8和倒数第二个数(每次减一),此时8在倒数第二位

d:continue

e:取结果:从数组最后一个往前面取

如果你需要随机1亿个数,你只需要random 1亿次,不会random到重复的数。

 

王子蒙 | 园豆:202 (菜鸟二级) | 2016-05-30 18:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册