生成一串随机数的算法_发牌问题
2012-02-21 09:35
176 查看
例子:从1-40之间随机取出n个数值,返回一个随机数的数组
这是一个很常见的算法,通常的做法是建立一个数组,从里面取出第一个数a,再取第二个数b,此时需要判断b不等于a才行,否则就需要重新生成,再取出第三个数c,c不能等于a或者b,依次类推,越到后面,由于没被选中的数字越少,就会不断的生成随机数,结果发现已经被生成过了,又不断的被放回去,这样效率肯定会有问题。
其实这是一个发牌的问题,解决的方法也很简单,只需要取出a后,将a和数组下标1的数字和a对调,再次生成随机数的时候,就别从下标1-40之间取,而是从2-40之间取值,得到b后,将下标2的数字和b对调。依次类推。这里因为使用的vbs,所以其实是0-39下标。生成的结果就在数组的0-n-1中。
这个例子很典型,留着做个参考吧
这是一个很常见的算法,通常的做法是建立一个数组,从里面取出第一个数a,再取第二个数b,此时需要判断b不等于a才行,否则就需要重新生成,再取出第三个数c,c不能等于a或者b,依次类推,越到后面,由于没被选中的数字越少,就会不断的生成随机数,结果发现已经被生成过了,又不断的被放回去,这样效率肯定会有问题。
其实这是一个发牌的问题,解决的方法也很简单,只需要取出a后,将a和数组下标1的数字和a对调,再次生成随机数的时候,就别从下标1-40之间取,而是从2-40之间取值,得到b后,将下标2的数字和b对调。依次类推。这里因为使用的vbs,所以其实是0-39下标。生成的结果就在数组的0-n-1中。
'显示输入框,将输入内容赋值给i n = InputBox("请输入n(6-40)",VbOnlyOk, "18") dim arr1(39) for i=0 to 39 arr1(i)=i+1 next lngMax=39 lngTmp=lngMax strData="" for i=0 to n-1 lngRand=rnd_Integer(i,lngMax) lngTmp=arr1(lngRand) arr1(lngRand)=arr1(i) arr1(i)=lngTmp Next Dim arr2() ReDim arr2(n-1) for i=0 to n-1 arr2(i)=arr1(i) next '得到一个Min和Max之间的随机数 Function rnd_Integer(Min,Max) Randomize rnd_Integer = int((Max-Min)*Rnd()+Min) End Function |
相关文章推荐
- 算法问题征解:怎样生成随机数而不借助任何工具?
- 生成n个从1到M(n <= M)之间的不重复的随机数问题(洗扑克牌算法)
- 算法笔记(IX) 一个随机数生成问题
- TopCoder 算法比赛图论实战1—最小生成树问题
- 随机数生成算法
- 算法证明题8.12 k生成树问题为搜索问题和NPC问题
- 从易到难编写C++程序,(6)问题:利用问题(5)的随机数生成实现发牌
- java生成抽样随机数的多种算法
- SecureRandom生成“强随机数”用于生成RSA*公钥/私钥*window和linux下不一致的问题
- 算法概率8.12 k生成树问题
- 随机数生成算法
- 随机数生成算法
- 解决随机数生成的坐标在对角线上的问题
- 最小生成树问题(Kruskal 算法)(克鲁斯卡尔)
- 极限元语音算法专家刘斌:基于深度学习的语音生成问题
- 生成随机数问题
- 史上最全的java随机数生成算法(转)
- (算法)关于随机数的生成
- java 生成若干位随机数的问题
- 生成n个互异随机数的初步算法