※ 引述《purplishfish (紫鱼)》之铭言:
: 各位版友大家好
: 最近再写一个抽奖程式
: 方法是每个序号对到一个乱数,最后取乱数最大值的该序号做为得奖人
: 但总觉得得奖人常常重复,不知道是不是乱数的问题?
: 目前乱数是使用(前面都有先呼叫Randomize)
: Rnd()
: 有试过 Rnd(Time)
这样没有任何用处。
VBA的rnd(k)多年来都一样:
k > 0 传回下一个随机乱数。
所以rad(1), rnd(8), rad(rnd())都是一样的。
而time (不是应该timer吗?不过反正你没看到错误,就当是time好了)
除了午夜以外,一定传回大于0的数字,所以也跟以上一样。
k = 0 重复传回相同的乱数。
k < 0 会以这个k为乱数种子,但是每次设种子就等于每次呼叫randomize
基本上没有人用。
省略k 跟 k > 0 一样。
现在微软的范例程式里面也都是写成rnd(),这就是他们的建议用法
至于什么rnd(0), rnd(-n)之类死人骨头根本就不要碰。
: 不知道还有没有其他可以更乱的方法?
没有看到你的程式,无法确定你到底是重复到怎样。但是除非规则规定,很少
听说这样一人产生一个乱数再选最大的作法。还有也不知道你母体有多少。如
果你一次只针对10个这种数量的得奖者抽选,那用什么方法都很容易重复。不
重复有不重复的方法,但是抽选过程要重新设计。
我会认为是规则的问题。如果你认为想要换random generator来解决,可以改
用以下网页最底下的程式,他利用AES来产生循环长度无限长的随机乱数。
https://bytes.com/topic/access/insights/
964786-vba-rnd-function-bad-what-use-instead
or https://goo.gl/cgWHiC
: 另一个想请教的问题是有没有办法降低excel的运跑速度?
直接上vb.net,简单用途转过去很快,也可以控制excel
(不过没什么效率,用ODBC较实在)。