oracle技术微信群,微信抢红包的PLSQL或者SQL版本

本帖最后由 samt007 于 2015-7-15 20:18 编辑

最近玩个游戏:微信的抢红包(随机的),谁抢得最少的,继续发红包,继续抢这样子。

觉得蛮有意思的,所以想是否可以搞个PLSQL的或者SQL版本的。然后搞在Apex里面,就可以用网页玩这个小游戏了。

输入参数:

总金额,红包个数;

输出的结果:

每个红包都是随机金额。

当然有限制:

1 尽量平均分。就是说,尽量随机的红包差异别太大。举个例子,你发个20元的红包,给7个人抢,第一个人直接抢了19元,那剩下的人就不用抢了。

2 金额随机。必须的。保留2位小数。

3 所有人都必须可以分到一定金额的红包。这个金额不允许是0,也不允许负数。

我的代码逻辑是:

先将红包平分

然后再加平分数剩一个随机数(-1~+1 之间的)。

这个逻辑得出的结果是比较合理的,也比较接近我玩微信抢红包的分法。

应该可以搞个SQL的版本的~找时间想一个。

------

代码:

DECLARE

L_TOTAL BINARY_INTEGER;

L_RAN_CT BINARY_INTEGER;

--

L_SUB_TOL NUMBER;

L_AVG NUMBER;

L_CURR NUMBER;

BEGIN

L_TOTAL := 20;

L_RAN_CT := 7;

--

L_SUB_TOL := 0;

L_AVG := ROUND(L_TOTAL/L_RAN_CT,2);

FOR I IN 1..L_RAN_CT LOOP

IF I < L_RAN_CT THEN

L_CURR := L_AVG+ROUND(L_AVG*(DBMS_RANDOM.VALUE (-1,1)*L_RAN_CT/10),2);

---子汇总:

L_SUB_TOL := L_SUB_TOL + L_CURR;

IF L_SUB_TOL>=L_TOTAL THEN---当总的分摊金额大于 原始总金额,必须要特殊处理

--要减少!

L_SUB_TOL := L_SUB_TOL - L_CURR;

---所以,L_CURR必须是还可以分摊的余数的一个随机数

L_CURR := ROUND((L_TOTAL-L_SUB_TOL)*dbms_random.value*(L_RAN_CT-I)/10,2);

WHILE L_CURR = 0 LOOP

DBMS_OUTPUT.PUT_LINE('L_CURR=0! LOOP!');

L_CURR := ROUND((L_TOTAL-L_SUB_TOL)*dbms_random.value*(L_RAN_CT-I)/10,2);

END LOOP;

L_SUB_TOL := L_SUB_TOL + L_CURR;

END IF;

ELSE

L_CURR := L_TOTAL-L_SUB_TOL;

L_SUB_TOL := L_SUB_TOL + L_CURR;

END IF;

DBMS_OUTPUT.PUT_LINE('第'||i||'个人:'||L_CURR);

END LOOP;

DBMS_OUTPUT.PUT_LINE('--------L_SUB_TOL:'||L_SUB_TOL);

END;

---结果:

第1个人:3.99

第2个人:1.33

第3个人:4.76

第4个人:4.31

第5个人:4.06

第6个人:1.07

第7个人:.48

--------L_SUB_TOL:20

第1个人:2.25

第2个人:4.62

第3个人:1.1

第4个人:1.65

第5个人:3.72

第6个人:2.62

第7个人:4.04

--------L_SUB_TOL:20

第1个人:3.95

第2个人:4.16

第3个人:4.79

第4个人:2.89

第5个人:3.83

第6个人:.01

第7个人:.37

--------L_SUB_TOL:20

第1个人:2.7

第2个人:3.51

第3个人:2.64

第4个人:3.21

第5个人:2.15

第6个人:2.8

第7个人:2.99

--------L_SUB_TOL:20

第1个人:4.73

第2个人:3.08

第3个人:1.13

第4个人:1.23

第5个人:.93

第6个人:2.25

第7个人:6.65

--------L_SUB_TOL:20

第1个人:3.85

第2个人:1.28

第3个人:3.36

第4个人:1.69

第5个人:3.7

第6个人:2.15

第7个人:3.97

--------L_SUB_TOL:20

第1个人:4.7

第2个人:3.1

第3个人:4.67

第4个人:4.27

第5个人:.33

第6个人:.16

第7个人:2.77

--------L_SUB_TOL:20

第1个人:4.3

第2个人:4.71

第3个人:2.17

第4个人:4.76

第5个人:2.86

第6个人:.07

第7个人:1.13

--------L_SUB_TOL:20

第1个人:4.17

第2个人:1.91

第3个人:1.31

第4个人:1.93

第5个人:1.2

第6个人:2.98

第7个人:6.5

--------L_SUB_TOL:20

第1个人:4.59

第2个人:4.43

第3个人:1.14

第4个人:3.64

第5个人:3.61

第6个人:1.52

第7个人:1.07

--------L_SUB_TOL:20

第1个人:4.15

第2个人:4.55

第3个人:1.46

第4个人:1.24

第5个人:3.99

第6个人:3.03

第7个人:1.58

--------L_SUB_TOL:20

第1个人:2.69

第2个人:3.23

第3个人:3.5

第4个人:3.77

第5个人:2.17

第6个人:1.64

第7个人:3

--------L_SUB_TOL:20

第1个人:2.09

第2个人:3.06

第3个人:3.46

第4个人:2.71

第5个人:2.73

第6个人:2.39

第7个人:3.56

--------L_SUB_TOL:20

第1个人:3.6

第2个人:4.54

第3个人:1.99

第4个人:2.7

第5个人:.91

第6个人:1.62

第7个人:4.64

--------L_SUB_TOL:20

第1个人:1.48

第2个人:1.42

第3个人:3.27

第4个人:2.43

第5个人:3.47

第6个人:1.85

第7个人:6.08

--------L_SUB_TOL:20

第1个人:1.33

第2个人:3.55

第3个人:3.31

第4个人:3.48

第5个人:4.72

第6个人:2.13

第7个人:1.48

--------L_SUB_TOL:20

第1个人:2.47

第2个人:2.54

第3个人:4.54

第4个人:3.4

第5个人:1.76

第6个人:1.48

第7个人:3.81

--------L_SUB_TOL:20

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值