作者MOONRAKER (㊣火星人玩转地球)
看板Visual_Basic
标题Re: [VBA ] 请问如何让乱数更乱 & 降低EXCEL运跑速度
时间Sun Feb 4 22:49:23 2018
※ 引述《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较实在)。
--
从前有个马铃薯王国 有个高贵伟大的国王
有的人尊敬他 有的人畏惧他 但有个人敢看不起他不只是一条龙
嘿呵 快出动 去征服 去摆平 嘿呵 快出征 去征服那条龙
嘿呵 快出动
(宰了它!轰了它!)嘿呵 快出征 去征服那条龙
:■ Potatoes and Dragons (C)Alphanim France 2004-05 :.
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 218.161.46.90
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Visual_Basic/M.1517755768.A.036.html
1F:推 purplishfish: 感谢回覆!Time回传是时分秒,程式没显示错误 02/04 23:32
2F:→ purplishfish: 被抽奖人有100多人 02/04 23:33
3F:推 purplishfish: 方法是参考这篇 02/04 23:35
5F:→ purplishfish: 因为偶尔会需要一次抽五个 02/04 23:36
6F:→ MOONRAKER: 一次抽五个可以考虑洗牌法 02/05 05:39
7F:→ MOONRAKER: 假设 k 个人,开一个1 to k的阵列,依序填入值1到k 02/05 05:40
8F:→ MOONRAKER: 接着每次产生两个1..j的乱数p, q,互换p, q位置的元素 02/05 05:41
9F:→ MOONRAKER: 这样洗牌若干次,然後从前面或後面取五个为得奖 02/05 05:42
10F:→ MOONRAKER: 这样看起来time传回跟以前一样是字串 不会错误可能是 02/05 05:49
11F:→ MOONRAKER: 自动转换到第一个 : 以前的数字 这样还是恒正的 02/05 05:49
12F:推 purplishfish: 谢谢,会试试看! 02/05 16:45
13F:推 ferretwind: 如果要看起来随机,就把每个人得过奖的次数记录起来 02/07 12:44
14F:→ ferretwind: 然後让那个人的中奖机率降低(1/(得奖次数+1)之类的 02/07 12:45
15F:→ ferretwind: 让程式变得不那麽随机 是变不随机而不是变更随机哦 XD 02/07 12:45
16F:→ ferretwind: 人类的"觉得随机"其实很不随机,所以你要的是减少随机 02/07 12:48
17F:→ ferretwind: 我好像应该推在原po那篇 XD 02/07 12:49
18F:推 purplishfish: 可是抽到过得不会再抽耶 02/09 08:32
19F:→ MOONRAKER: 如果不要让他再抽就是排除法啦 直接让他机率0或跳过 02/09 15:23
20F:→ MOONRAKER: 去年也有写个抽奖 那时是先摇一次决定有没有中奖 再摇 02/09 15:25
21F:→ MOONRAKER: 一次看他中什麽奖 02/09 15:25