Re: [VBA ] 请问如何让乱数更乱 & 降低EXCEL运跑速度

楼主: MOONRAKER (㊣牛鹤鳗毛人)   2018-02-04 22:49:23
※ 引述《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较实在)。
作者: purplishfish (紫鱼)   2018-02-04 23:32:00
感谢回复!Time回传是时分秒,程式没显示错误被抽奖人有100多人方法是参考这篇http://isvincent.pixnet.net/blog/post/29124644因为偶尔会需要一次抽五个
楼主: MOONRAKER (㊣牛鹤鳗毛人)   2018-02-05 05:39:00
一次抽五个可以考虑洗牌法假设 k 个人,开一个1 to k的阵列,依序填入值1到k接着每次产生两个1..j的乱数p, q,互换p, q位置的元素这样洗牌若干次,然后从前面或后面取五个为得奖这样看起来time传回跟以前一样是字串 不会错误可能是自动转换到第一个 : 以前的数字 这样还是恒正的
作者: purplishfish (紫鱼)   2018-02-05 16:45:00
谢谢,会试试看!
作者: ferretwind (FF)   2018-02-07 12:44:00
如果要看起来随机,就把每个人得过奖的次数记录起来然后让那个人的中奖机率降低(1/(得奖次数+1)之类的让程式变得不那么随机 是变不随机而不是变更随机哦 XD人类的"觉得随机"其实很不随机,所以你要的是减少随机我好像应该推在原po那篇 XD
作者: purplishfish (紫鱼)   2018-02-09 08:32:00
可是抽到过得不会再抽耶
楼主: MOONRAKER (㊣牛鹤鳗毛人)   2018-02-09 15:23:00
如果不要让他再抽就是排除法啦 直接让他机率0或跳过去年也有写个抽奖 那时是先摇一次决定有没有中奖 再摇一次看他中什么奖

Links booklink

Contact Us: admin [ a t ] ucptt.com