想弄个公平抽奖的程序,想问问有什么类似彩票这种不太容易操纵的随机数吗

2020-10-08 08:46:46 +08:00
 haython
抽奖规则就是每个人先拿到一个编号,在开奖之前,公布总参加人数,等到彩票开奖之后,根据彩票的数字,取余总参加人数,余数加 1 就是得奖的编号。
但是彩票这个开奖频率太低了,有没有其它频率高点的代替?或者其它类似彩票这种,我可以使用多个进行交叉进行
4097 次点击
所在节点    问与答
42 条回复
May725
2020-10-08 08:51:10 +08:00
股票基金指数,感觉没那么容易操作
Kr98
2020-10-08 08:51:53 +08:00
Cloudflare 的 League of Entropy 了解一下
利用多个不同机构的随机源获取去中心化的随机数
renmu123
2020-10-08 09:04:54 +08:00
温度的平均值,自然的东西人比较难操控
whileFalse
2020-10-08 09:07:13 +08:00
比特币的出块哈希?但是不稳定,或者说有延迟。
Perry
2020-10-08 09:09:24 +08:00
需求完全没有说清楚,什么叫开奖频率高?要有多高?
imdong
2020-10-08 09:20:17 +08:00
真的要公平的话,我感觉反而不能使用真正的随机数,而是应该使用可查到但不可预知的事件。

假设使用彩票作为随机种子,可以加入时间因素,生成结果。

解决了彩票频率不够高的问题,但是需要在彩票开奖前就固定奖池。

证券的数据,或者大家的数据作为种子。

比如指定时间内,参与用户的信息时间选择结合一起产生开奖结果,但是要加入其他因素,可能被控制开奖。提前公布一个秘密数字作为干扰项,开奖后可查。加密密文与密匙。
crclz
2020-10-08 09:21:27 +08:00
@whileFalse 我想到也是这个。外加上把开源的算法给复现,这样就可以查验真伪了。

但是这个预防不了庄家增加虚拟的账户来拉低真实用户的中奖率。(好像没什么东西可以预防)
kangsheng9527
2020-10-08 09:29:36 +08:00
别使用那些人家掌握核心科技的如大气质量那样的随机数。。。反正自己不熟悉的领域别用。。。

最简单的取随机数就是,参与总人数中用伪随机数产出 10 个人取其提交计入数据库 unixnano 时间,其 10 人均值的数作为随机数。

随机或者指定序号的 10 个人其参与提交时间肯定不能特定的,绝对是不可谋划的,其次是精确到 unixnano 这个级别就算有心谋划,网络延时等都不可避免,所以绝对是不可谋划定制的随机数。

而是是自己领域内可证实的随机数,而其他大气数据产出的随机数之类你不懂不建议使用,股票基金的系统也不是你写的你也没有做过绝对掌大财富可操控全局的庄家,所以。。。
flowercoder
2020-10-08 09:33:09 +08:00
大概明白了,觉得随机数不够随机,想让开奖结果更随机一些对吧,像前面人说的,一般取当天某证券指数最后两位做变量值,这已经很公平了,我的想法是可以把最后的参与人数映射到一个⚪上,除以总人数后得到一个角度值,这个时候,取一个随机角度值,如果取两人就加 180°,如果取 6 人就每次加 60°,这样保证了参与人的分布性。当然你也可以考虑取 N 次随机角度值
flowercoder
2020-10-08 09:38:38 +08:00
@kangsheng9527 一般取股票基金啥的,都是取上证或是大型综合指数,这些指数不是几十亿就能决定的,而且不是取所有值,只取小数点最后两位,人为操作可能性接近于无,由于股票最后时间交割会采用集合竞价之类的方式,所以在最后时间的操控难度极大。就算有绝对掌大财富也是不可能控制最后两位小数的
fangpeishi
2020-10-08 09:49:04 +08:00
Cbdy
2020-10-08 09:49:57 +08:00
可以去取电流的噪声,宇宙背景噪声之类的
cmdOptionKana
2020-10-08 09:53:37 +08:00
@flowercoder 这个方法极好,而且完全不用公式,非常直观,比如上证指数是 3218.05 ,那么

如果参与人数少于 100,中奖号码就是 5
如果参与人数为 100 - 1000 之间,中将号码就是 805
依此类推。
cmdOptionKana
2020-10-08 09:54:52 +08:00
@fangpeishi
@Cbdy

楼主的想法应该是想让不懂编程的人也能轻松地确认公平、随机。
flowercoder
2020-10-08 10:13:57 +08:00
@cmdOptionKana 这方式就是简单而已,很多人都是你说的这么用的,但是它只能取最后两位,个位数的话最后几分钟的变化概率会降低,比如 14:57 的时候是 8 的话,最可能出现的情况就是 6 、7 、8,所以为了确保它的公平性,只取两位小数。
cmdOptionKana
2020-10-08 10:25:52 +08:00
@flowercoder 确实有局限性,如果从拿号到开奖隔开几个小时就没问题了。另外这个方法在周末等股市不运作的时间段无法使用,如果楼主是节假日搞活动那就要想别的办法。
lxilu
2020-10-08 10:39:50 +08:00
Intel DRNG
yujiang
2020-10-08 10:45:55 +08:00
用彩票有一种叫时时彩的,五分钟还是多久的出一次三位数
lxilu
2020-10-08 10:47:49 +08:00
既有股票,其他交易市场也可
ybbswc
2020-10-08 11:01:29 +08:00
excel
randbetween()
现场写出来就行了。。。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/713011

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX