抽奖程序实现方法

来源:互联网 发布:mysql性能监控工具 编辑:程序博客网 时间:2024/04/28 10:13

一共有三个方法,群里一朋友告诉我的,先收集起来,以后再整理,记录下先,HOHO

 

口乂生-卷心菜(28104207) 16:16:53
取MD5,设置某几位符合什么规则的时候就认为中奖
白痴鱼<x03570227@163.com> 16:17:36
什么意思 后面句不太明白
白痴鱼<x03570227@163.com> 16:17:51
另外 还有个问题 就是每个将项有自己的一个机率的
口乂生-卷心菜(28104207) 16:18:01
比如你的名字+salt 的md5是 1234567890123456
白痴鱼<x03570227@163.com> 16:18:14
比如中100元话费的机率是1% 中50元的机率是10%
口乂生-卷心菜(28104207) 16:18:28
1%嘛
祖国在我心中(42713491) 16:18:30
我操,还用MD5那鬼东西加密
口乂生-卷心菜(28104207) 16:18:58
MD5一共有2的128次方种可能性
口乂生-卷心菜(28104207) 16:19:06
合理的顶一下规则即可
白痴鱼<x03570227@163.com> 16:19:12
比如你的名字+salt 的md5是 1234567890123456
规则怎么设置
白痴鱼<x03570227@163.com> 16:19:31
你再给举个例子看 产生什么样的MD5 出现什么样的结果
口乂生-卷心菜(28104207) 16:19:49
比如md5是1234567890123456
口乂生-卷心菜(28104207) 16:19:58
为了简化运算
口乂生-卷心菜(28104207) 16:20:04
取前2位
口乂生-卷心菜(28104207) 16:20:21
共有16*16 = 256种情况
记忆的阳光(6235320) 16:20:33
前两位一样就中奖吗
白痴鱼<x03570227@163.com> 16:21:05
 听得一头雾水
记忆的阳光(6235320) 16:21:17

口乂生-卷心菜(28104207) 16:21:19
比如说只取第一位吧
口乂生-卷心菜(28104207) 16:21:30
你指定第一位是1的才中奖
口乂生-卷心菜(28104207) 16:21:50
那中奖概率就是1/16 = 6.25%
白痴鱼<x03570227@163.com> 16:21:53
嗯 那这个怎么控制概率?
记忆的阳光(6235320) 16:21:59
 那要是取前三位不是很难了
白痴鱼<x03570227@163.com> 16:22:17
汗 原来这样啊
口乂生-卷心菜(28104207) 16:22:40
你把md5取足够多,然后对10取模~
口乂生-卷心菜(28104207) 16:22:44
=1的就中奖……
白痴鱼<x03570227@163.com> 16:22:51
嗯 我看下概率怎么算
口乂生-卷心菜(28104207) 16:23:24
要1%的话,直接取前2位,转成int类型,然后对100取模
口乂生-卷心菜(28104207) 16:23:56
要千分之一,取前3位,转成int,对1000取模
白痴鱼<x03570227@163.com> 16:24:12
3/16 mod 1000???
口乂生-卷心菜(28104207) 16:24:14
要千分之5,取前3位,转int,对200取模
记忆的阳光(6235320) 16:24:24
 四十万分这一呢
白痴鱼<x03570227@163.com> 16:24:30
要千分之5,取前3位,转int,对200取模
看下怎么算?
白痴鱼<x03570227@163.com> 16:24:41
前三位等于什么呢?
口乂生-卷心菜(28104207) 16:24:49
md5的前三位啊
记忆的阳光(6235320) 16:24:50
不知道

口乂生-卷心菜(28104207) 16:24:55
后三位也行
记忆的阳光(6235320) 16:25:11
哦,只是说机率太少了
记忆的阳光(6235320) 16:25:18
给一个值加密码
记忆的阳光(6235320) 16:25:29
前三位一样就中奖,是这样的吗
白痴鱼<x03570227@163.com> 16:26:01
前三位能取到 但是什么条件才算是中奖呢
比如前三位是:123 那123为什么就是中奖呢
口乂生-卷心菜(28104207) 16:26:10
差不多,关键就是int数值的基
口乂生-卷心菜(28104207) 16:26:25
这种理解起来比较麻烦~
口乂生-卷心菜(28104207) 16:26:31
还有别的方法可以搞~
记忆的阳光(6235320) 16:26:37
 什么方法
白痴鱼<x03570227@163.com> 16:26:38
另一种再说下
口乂生-卷心菜(28104207) 16:26:55
如果你的奖品数目不限的话……
白痴鱼<x03570227@163.com> 16:27:02
转int  这个什么意思
白痴鱼<x03570227@163.com> 16:27:13
数目暂时不受限制
口乂生-卷心菜(28104207) 16:27:15
直接随机之后取模就行……对概率控制最容易的了~
口乂生-卷心菜(28104207) 16:27:28
取随机数~,取模……
口乂生-卷心菜(28104207) 16:27:47
比如你要千分之五,就随机一个小数,判断其是否小于0.005
口乂生-卷心菜(28104207) 16:27:54
随机一个0~1的小数
记忆的阳光(6235320) 16:28:01
那要求呢
白痴鱼<x03570227@163.com> 16:28:13
嗯 这个简单
口乂生-卷心菜(28104207) 16:28:28
你要40万分之1,就随机一个小数,判断是否小于 1/400000……
记忆的阳光(6235320) 16:28:38

口乂生-卷心菜(28104207) 16:28:40
你要40万分之3,就随机一个小数,判断是否小于 3/400000……
白痴鱼<x03570227@163.com> 16:28:40
如果是10% 生成随机数 看它是否小于0.1 是吧
口乂生-卷心菜(28104207) 16:28:45
对~
口乂生-卷心菜(28104207) 16:28:59
控制数量的话
记忆的阳光(6235320) 16:29:01
那要是做假呢
白痴鱼<x03570227@163.com> 16:29:04
额 那现在有很多个奖项 而且每个奖项的概率不一样
白痴鱼<x03570227@163.com> 16:29:06
这个怎么搞
记忆的阳光(6235320) 16:29:14
指定一个人中奖,别人还看不出来
口乂生-卷心菜(28104207) 16:29:15
累加概率啊
白痴鱼<x03570227@163.com> 16:29:14
每个将其都去比一比?
白痴鱼<x03570227@163.com> 16:29:32
口乂生-卷心菜(28104207) 16:29:15
累加概率啊
怎么搞?
口乂生-卷心菜(28104207) 16:30:37
一等奖概率 0.01     <0.01的中一等奖
二等奖      0.1     0.01<  随机小数 < 0.11 的中二等奖
三等奖     0.3      0.11<  随机小数 < 0.31的中二等奖
白痴鱼<x03570227@163.com> 16:30:47
嗯 明白
口乂生-卷心菜(28104207) 16:30:56
实现的时候这样搞:
口乂生-卷心菜(28104207) 16:31:05
定义一个数组
白痴鱼<x03570227@163.com> 16:31:08
这样的话 就是所有机率加起来要小于1
白痴鱼<x03570227@163.com> 16:31:12

口乂生-卷心菜(28104207) 16:31:22
[0,0.01,0.11,0.31]
口乂生-卷心菜(28104207) 16:31:25
然后随机一个小数
白痴鱼<x03570227@163.com> 16:31:40
看是哪两个数之间 是吧
口乂生-卷心菜(28104207) 16:31:45
没错
口乂生-卷心菜(28104207) 16:31:55
因为这个数组是排序数组
口乂生-卷心菜(28104207) 16:32:04
直接从前往后找就行了
口乂生-卷心菜(28104207) 16:32:24
如果随机数比当前元素大,就往后循环
口乂生-卷心菜(28104207) 16:32:34
直到随机数小于当前元素
口乂生-卷心菜(28104207) 16:32:41
输出当前元素位置
口乂生-卷心菜(28104207) 16:32:52
换算一下就是奖项等级了
白痴鱼<x03570227@163.com> 16:33:22
嗯嗯 聪明 哈哈
口乂生-卷心菜(28104207) 16:33:36
你笨~
记忆的阳光(6235320) 16:33:55
 
白痴鱼<x03570227@163.com> 16:34:40
...
口乂生-卷心菜(28104207) 16:34:42
要限制得奖数目的话
白痴鱼<x03570227@163.com> 16:34:50
嗯 继续 我听着
口乂生-卷心菜(28104207) 16:34:53
每个用户中几等奖
口乂生-卷心菜(28104207) 16:35:05
你就更新一下还剩几个
白痴鱼<x03570227@163.com> 16:35:32
如果没有奖了 取消数组里的数据>
白痴鱼<x03570227@163.com> 16:35:33
?
口乂生-卷心菜(28104207) 16:35:48
嗯,反正就是别再出奖就是了
白痴鱼<x03570227@163.com> 16:35:51
嗯嗯
口乂生-卷心菜(28104207) 16:36:08
还有一个更直观的方法
白痴鱼<x03570227@163.com> 16:36:11
明白 谢谢哈
口乂生-卷心菜(28104207) 16:36:17
[0.1,0.3,0.5]
白痴鱼<x03570227@163.com> 16:36:18
还有啊 继续继续 !~
口乂生-卷心菜(28104207) 16:36:26
分别代表一二三等奖
口乂生-卷心菜(28104207) 16:36:39
随机一个小数N
口乂生-卷心菜(28104207) 16:38:30
a = [0.1,0.3,0.5];
i = 0;
while(N>0 && i < a.length)
   N = N - a[i++];
echo i;

口乂生-卷心菜(28104207) 16:38:35
i就是中的奖
口乂生-卷心菜(28104207) 16:38:52
这个设置中奖概率直观一些
口乂生-卷心菜(28104207) 16:39:47
如果2等奖没了,就修改上面那个数组:
a[2] += a[1];
a[1] = 0;
口乂生-卷心菜(28104207) 16:40:08
这样就可以保证抽到2等奖的用户,会顺次得到3等奖~
白痴鱼<x03570227@163.com> 16:40:25
=.=! 什么办法都有啊
白痴鱼<x03570227@163.com> 16:40:29
我先记下
口乂生-卷心菜(28104207) 16:40:50
更简单的,没奖了以后即使再抽到二等奖,直接给个没奖得了
=_=