各位大牛,请教一下:
我需要生成8位随机数字作为主键 怎样才能不让它重复或者说重复几率很小。
可以给下可运行代码和注释么,本人菜鸟一个
谢谢!!!
做主键的随机数唯一可以用的就是guid.8位数字就别想了.你的表最多只能有1000w行数据.
你直接生成0到999999999之间的随机数.拿来用不就是了.至于不重复.你都主键了还想什么不重复..重复了他直接报异常了.你重新插就是.
不是一億嗎?我算錯了?
想想也是....
只能數字又不要重複,為何不用流水號,何必隨機
我一开始也是这么想的,但是不行啊,上面要求必须随机......我没法子
@ly丶乐:
8位數也才一億種組合,重複機率就這樣,重複處裡勢必得做,用Random吧
@RosonJ: 我用的就是Random 但是测试的时候重复一堆 不忍直视了 ......
@ly丶乐:
我只能說,一億種組合就已經限制你的機率,重複率最就是第一筆(0/一億),之後重複率勢必越來越大,這是機率的問題,不是你糾結用什麼隨機機制能解決的
@RosonJ: 谢谢了 我算是知道我这没法玩了
初始化一个集合,1亿个数字。每次请求randown.next(0,arr.length)随机取集合中的数字,取完删除。
反正1亿个数字内存也没多少,然后取出来的数字可以存数据库呀,本地文件呀。程序重启之后也能正常使用
话说,你这个需求蛮奇葩的
谢谢咯.......
Random的实现已经很好了
你可以研究下洗牌算法,然后把洗好的牌保存好,一个一个去取,取出来的结果看着就是随机的,而且还不会重复!
我去研究研究,谢了
建议使用GUID或者是时间戳
如果非要是随机数的话,需要将已生成的随机数排除掉
我已经放弃了
var maxNum = 1000000;
var randomNum = GuidUtil.GetGuid().GetHashCode() % maxNum;
给你答案吧 .net 自带的Random在单位时间里面获取的值是一样的 所以会有很多重复的 用guid的hashcode来处理
Random最好不用 会有性能坑
可以试试时间戳
你说的一大堆重复的 是偶尔有几个重复的,还是一长串都是重复的。
C#随机数是伪随机,间隔时间过短 会产生重复数字(例如写在循环里,得通过一些技巧来避免这样的重复数字)。
既然是自己生成的主键,可以在插入前 先去数据库查一下是否存在,不存在就插入,存在就重新生成再查找。
这个很好实现,比如你要取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到重复的数。