怎样设计一个抽奖算法,能达到真正的公开公正和权威( 二 )
■网友
我想这个问题其实可以表述为“如何实现一个真随机算法”。之后就可以找搞物理的人来回答了
■网友
只要让全部抽奖者都认同并能理解即可。
首先向参与者科普哈希函数,让参与者理解控制哈希算法的结果以现在的科学技术水平是不可能的。然后开始抽奖。
选取一个哈希函数(如sha256),每个抽奖者发一段话(评论),用评论+抽奖者的ID的哈希值作为抽奖者的摇号。
然后开奖时使用可被重复验证的信息的哈希值,取离这个哈希值最近(差最小)的摇号的抽奖者颁奖。
这个信息可以是很多东西,最重要的是修改这个信息来控制中奖需要付出的成本远高于奖品成本。
比如你抽一个移动电源,我用雷军发的下一条微博做信息。
比如你抽10w现金,我用开奖当天的微博热搜榜单作信息。
比如你抽100w,我用开奖当天的新闻联播录像作信息。
当然用高赞回答的比特币区块哈希值最简单,且公平性很高,就是参与者可能搞不懂或者验证困难或者觉得可信度低吧(毕竟比特币这些天境况不好)
■网友
借用这个问题下面的思路:截图如何证明当前时间?首先,大家约定好是什么时间产生的比特币blockhash值,比如今天19:00之后产生的第一组hash值,这个hash值基本是事先无法知道的。然后把大家的号码(姑且认为每个参与活动的人拿到的都是不同的号码),简单地和那个hash值对接起来(或者玩点其他的花样)做一个md5,最后按照这个md5值的数字大小来排个序,就抽出奖了。
■网友
請注意Fisher–Yates shuffle。。。
簡單直接的隨機抽獎算法。
之前要寫一個程式模擬AQL驗收標準無意發現。
https://en.m.wikipedia.org/wiki/Fisher–Yates_shuffle
The Fisher–Yates shuffle is an algorithm for generating a random permutationof a finite sequence—in plain terms, the algorithm shuffles the sequence. The algorithm effectively puts all the elements into a hat; it continually determines the next element by randomly drawing an element from the hat until no elements remain. The algorithm produces an unbiased permutation: every permutation is equally likely. The modern version of the algorithm is efficient: it takes time proportional to the number of items being shuffled and shuffles them in place.
■网友
首先 算法公开!可复盘!可以由怀疑的人使用自己的计算机在相同版本的PHP下。输入相同的条件产出相同的值。如果使用真随机数,那么谁也无法得知这个随机数是不是开发者留的后门产生的。
然后是抽奖人的真实性。数据过滤掉所有虚假的抽奖人。但不能过滤掉正常的抽奖人,之前王思聪抽113人中奖抽中112个女的说明微博过滤掉了正常的抽奖人,
可将收款地址,身份证号,实名账号等作为真实性核验的依据。当然公司年会抽奖就不用了。
抽奖最重要的公平,随机数种子的选取最为重要,随机数种子应有足够的取值范围比如把所有将开奖彩票的开奖结果作为随机数种子,还有天气什么的。最终呢我写了一个PHP抽奖页 确保绝对公平。以至于抽奖结果我自己都不知道。 以下就是PHP代码了搞个网页空间(虚拟主机)就可以运行 稳定可用\u0026lt;?php//公平抽奖算法 作者QQ772875181 求指出不足之处//打赏支付宝账户 772875181@qq.com ////1抽奖不能简单的取随机数取余 因为这样前n个人的概率会提高 要排除提高的那部分概率//或者随机数生成器的生成范围是变化的//比如一万人中抽1000个 第一个随机数范围是0-10000第二个就要0-9999从剩的里面抽//不能简单使用mod(rand(),10000) 因为生成器范围是0-32767 那么前2767人的概率就大了 //也就是说 rand()在大于30000时应该抛弃//2为什么不用真随机数或者机器生成随机数 而要使用随机数种子这样种子一样每次不就一样了么?//不使用完全随机的真随机数的原因是因为//真随机数成本高/真随机数无法用相同计算机反复测试出过程。//3抽奖随机数种子的选取。//1随机种子选取空间一定要大//比如33选6加16选1(双色球)的全部事件数一定小于10000选1000的全部事件数。10000人中选1000人//2随机数种子开奖前不可预测//随机数种子的来源一定是未知事件的值。但不要进行MD5或者其他哈希运算//为什么不要进行MD5或者哈希运算呢?因为哈希运算并非随机散列哈希值存在余数循环的问题//以其作为种子我认为不可靠,但实际也是很可靠的。//推荐采用彩票数据联合股票数据//比如当天开奖的双色球联合3D联合7乐彩联合体彩超级大乐透七星彩排列3排列5//9点前就不准人再参与了,比如2020年1月福彩3D开出901华东15选5开出0304080910体彩排列5开出96462双色球开出03060814192612//那么随机数种子就可以是90103040809109646203060814192612//没有人能够在开奖前拿下这个随机数种子。因为彩票开奖结果与购买人有关你的抽奖与其是不相关事件//因为传闻爆出有的时候中奖人数多于预期就重抽。所谓直播开奖都是录像//或者用世界天气预报 北京晴 巴黎雨 墨尔本雨 纽约雾 ……//那么随机数种子就是 晴雨雨雾阴…… 不能取将近地区的因为天气预测性太大所以真正的随机种子选取空间就降低了//4关于伪随机数生成 新版php7.2.9的随机数生成器生成的随机数已有大幅改善不会出现条纹//往往普通的随机数生成器最大值为32767//而数学函数中的随机数生成器可以生成的随机数最大为2147483647//5结果反推 及不服的人的问题//如果随机数种子一致则每次抽奖都会抽到完全一样的人可以作为程序验证和检测//将源码开放,将同一套源码部署在相同版本PHP环境下输入同样的随机数种子和抽奖名单//会得出相同的中奖人则代表抽奖代码无误//6为什么不用哈希接近法?//因为更多的运算量 ,且有人无法认同比特币区块链的取值来源。// mt_srand("1234");//echo mt_getrandmax();// echo "\u0026lt;br\u0026gt;试机号";// echo mt_rand();// echo "\u0026lt;br\u0026gt;试机号";// echo mt_rand();// echo "\u0026lt;br\u0026gt;试机号";// echo mt_rand();// echo "\u0026lt;br\u0026gt;试机号";// echo mt_rand();//echo "\u0026lt;br\u0026gt;试机号";?\u0026gt;\u0026lt;html\u0026gt;\u0026lt;head\u0026gt;\u0026lt;title\u0026gt;公平在线抽奖 年会抽奖\u0026lt;/title\u0026gt;\u0026lt;/head\u0026gt;\u0026lt;form action="" method="post"\u0026gt;抽奖名单 一行一个\u0026lt;br\u0026gt;\u0026lt;textarea name="people" \u0026gt;\u0026lt;?php\tif(isset($_POST)){echo $_POST;}\t\t?\u0026gt;\u0026lt;/textarea\u0026gt;\u0026lt;br\u0026gt;总共要抽中几人?(所有奖项的合计人数可根据顺序决定谁中大奖)\u0026lt;br\u0026gt;\u0026lt;input name="number" value="https://www.zhihu.com/u0026lt;?php\tif(isset($_POST)){echo $_POST;}\t\t?\u0026gt;"\u0026gt;\u0026lt;/input\u0026gt;\u0026lt;br\u0026gt;随机数种子 每个随机数种子只能用一次\u0026lt;br\u0026gt;\u0026lt;input name="randsand" value="https://www.zhihu.com/u0026lt;?php\tif(isset($_POST)){echo $_POST;}\t\t?\u0026gt;"\u0026gt;\u0026lt;/input\u0026gt;\u0026lt;br\u0026gt;\u0026lt;input type="submit" value="https://www.zhihu.com/api/v4/questions/21416290/提交抽奖" /\u0026gt;\u0026lt;br\u0026gt;谁中奖最关键之处就在于随机数种子的选取。\u0026lt;br\u0026gt;相同的随机数种子且抽奖人相同会使相同的一批人中奖\u0026lt;br\u0026gt;随机数种子选取公开范围大,选取前每个人不知道\u0026lt;br\u0026gt;例如使用 很多即将开奖彩票的中奖号码连在一起做为随机数种子\u0026lt;br\u0026gt;本地php环境为php7.2.9 \u0026lt;a href="http://ligelide.oss-cn-qingdao.aliyuncs.com/choujiang1.php"\u0026gt;源码下载地址\u0026lt;/a\u0026gt;\u0026lt;br\u0026gt;\u0026lt;a href="https://wlw.liyaodong.cn/choujiang1.html"\u0026gt;测试地址\u0026lt;/a\u0026gt;\u0026lt;br\u0026gt;\u0026lt;/form\u0026gt;\u0026lt;/html\u0026gt;\u0026lt;?phpif(!isset($_POST)){die();}if(!isset($_POST)){die();}if(!isset($_POST)){die();}if(!$_POST){die();}if(!$_POST){die();}if(!$_POST){die();}$prizenum =$_POST;//中奖数$randsand = $_POST;//随机数种子$people = explode("\\r\", $_POST);//按回车分割字符串mt_srand($randsand);//设置随机数种子echo "所有抽奖人数组";var_dump($people);if (count($people) != count(array_unique($people))) {//如果用人把自己名字写了两遍就报错\techo "\u0026lt;h1\u0026gt;"; echo \u0026#39;该数组有重复值,有人把自己名字写了好几遍,他是\u0026#39;;\techo "\u0026lt;/h1\u0026gt;";\t$unique_arr = array_unique ( $people ); \t$repeat_arr = array_diff_assoc ( $people, $unique_arr );\tvar_dump($repeat_arr);\tdie();}$allpeoplenum=count($people);echo "\u0026lt;br\u0026gt;总共有".$allpeoplenum."人参与抽奖";echo "\u0026lt;br\u0026gt;随机数种子是".$randsand;echo "\u0026lt;br\u0026gt;需要抽中".$prizenum."人";if($allpeoplenum\u0026lt;$prizenum){die("\u0026lt;h1\u0026gt;中奖人数大于全体人数\u0026lt;/h1\u0026gt;");}$i =$prizenum;//循环抽n次 临时变量$i$zhongjiang = array();//unset($people);//echo"测试";//var_dump($people);//$i = 0;while($i){\t$j =mt_rand(0,$allpeoplenum-1);\t\t//echo "\u0026lt;br\u0026gt;随机数".$j;//将一个随机数打印\t\tarray_push($zhongjiang,$people);//将中奖的那个人压入中奖数组\tunset($people);//从抽奖数组中把中奖者删了\t$people = array_values($people);//把抽奖者数组重新索引\t//echo "剩余抽奖人";\t//var_dump($people);\t$allpeoplenum=$allpeoplenum-1;\t$i =$i-1;\t}echo "\u0026lt;br\u0026gt;中奖人数组";var_dump ($zhongjiang);echo"\u0026lt;h1\u0026gt;以下为中奖名单 可根据排名发奖\u0026lt;/h1\u0026gt;\u0026lt;br\u0026gt;";echo"\u0026lt;h2\u0026gt;";foreach ($zhongjiang as \u0026amp;$value) { echo $value; echo "\u0026lt;br\u0026gt;";}echo"\u0026lt;/h2\u0026gt;";?\u0026gt;
推荐阅读
- 聪明人养花,这3种“花”怎样也要养一盆,每年能省不少医药费
- 同比■同比增长7.1%!2021年的第一个节你花了多少钱?
- “他是我第一个会说普通话的老师”:一对师生折射青海山村蝶变
- “厉行节约反对浪费”主题设计公益活动成果发布
- 有必要重新开个C店吗
- 互联网怎样解决“家政服务上门速度慢”的问题
- 趣头条|雪佛兰创界,外观设计大气,你会喜欢这款车吗?
- 环球车讯网|全新大众途观,外观的设计更加时尚,更加大气,“满满”的高级感
- 趣头条|日产奇骏,整体设计不错,你会喜欢吗
- 怎样看待从1月8号起,QQ钱包开始提现收费
