转盘中奖,设置权重来设置中奖概率

Shane1994 2018-04-16 06:00:27
转盘小游戏中,存在几个中奖选项;通过对选项进行权重设置,来控制中奖概率
...全文
3350 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
Shane1994 2018-04-19
  • 打赏
  • 举报
回复
引用 12 楼 YIGOO4 的回复:
[quote=引用 11 楼 apollokk 的回复:] [quote=引用 8 楼 YIGOO4 的回复:] [quote=引用 5 楼 apollokk 的回复:]
    var Items = ['特', '一', '二', '三'], Weight = [1, 3, 5, 10], Jiang = [];
    for (var i = 0, n = Weight.length; i < n; i++) {
        for (var j = 0, c = Weight[i]; j < c; j++) {
            Jiang.push(Items[i]);
        }
    }
    function Run() {
        if (Jiang.length == 0) {
            alert('奖已经抽完了');
            return;
        }
        var rnd = Math.floor(Math.random() * Jiang.length);
        var luck = Jiang.splice(rnd, 1);
        //这里可以控制转盘转到某个指定位置才停下来
        alert('恭喜中了个'+luck+'等奖');
    }
什么要n=length;然后再i<n;不可以直接i<length吗?为什么用floor(),而不用ceil(),round()?用哪个比较好;var luck = Jiang.splice(rnd, 1);之后,除了赋值给luck,jiang[]也发生了改变?[/quote] 可以直接i<xx.length,但每次循环都要计算一次length floor是向下取整,ceil是向上取整,round是四舍五入,这里要用向下取整 splice会改变原来的数组,这样就不会重复[/quote]当Jiang[].length为1时,random()向下取整,永远都取不了1啊,random()是不包含1的,最后那个不是永远都抽不中?[/quote]想错了,Jiang[0]可以的,秀逗了,不好意思
Shane1994 2018-04-19
  • 打赏
  • 举报
回复
引用 11 楼 apollokk 的回复:
[quote=引用 8 楼 YIGOO4 的回复:] [quote=引用 5 楼 apollokk 的回复:]
    var Items = ['特', '一', '二', '三'], Weight = [1, 3, 5, 10], Jiang = [];
    for (var i = 0, n = Weight.length; i < n; i++) {
        for (var j = 0, c = Weight[i]; j < c; j++) {
            Jiang.push(Items[i]);
        }
    }
    function Run() {
        if (Jiang.length == 0) {
            alert('奖已经抽完了');
            return;
        }
        var rnd = Math.floor(Math.random() * Jiang.length);
        var luck = Jiang.splice(rnd, 1);
        //这里可以控制转盘转到某个指定位置才停下来
        alert('恭喜中了个'+luck+'等奖');
    }
什么要n=length;然后再i<n;不可以直接i<length吗?为什么用floor(),而不用ceil(),round()?用哪个比较好;var luck = Jiang.splice(rnd, 1);之后,除了赋值给luck,jiang[]也发生了改变?[/quote] 可以直接i<xx.length,但每次循环都要计算一次length floor是向下取整,ceil是向上取整,round是四舍五入,这里要用向下取整 splice会改变原来的数组,这样就不会重复[/quote]当Jiang[].length为1时,random()向下取整,永远都取不了1啊,random()是不包含1的,最后那个不是永远都抽不中?
Shane1994 2018-04-18
  • 打赏
  • 举报
回复
引用 1 楼 jslang 的回复:

var g = ["一等奖","二等奖","三等奖","未中奖"];
var p = [1,5,20,74];
var s = p.reduce(function(pv, v){
	return pv+v;
},0);
var r = Math.random()*s;
for (var i=0, n=0; i < p.length; i++) {
	n += p[i];
	if (n>=r) break;
}
alert(g[i]);
好像还没有考虑到奖项的抽完?
Shane1994 2018-04-18
  • 打赏
  • 举报
回复
引用 5 楼 apollokk 的回复:
    var Items = ['特', '一', '二', '三'], Weight = [1, 3, 5, 10], Jiang = [];
    for (var i = 0, n = Weight.length; i < n; i++) {
        for (var j = 0, c = Weight[i]; j < c; j++) {
            Jiang.push(Items[i]);
        }
    }
    function Run() {
        if (Jiang.length == 0) {
            alert('奖已经抽完了');
            return;
        }
        var rnd = Math.floor(Math.random() * Jiang.length);
        var luck = Jiang.splice(rnd, 1);
        //这里可以控制转盘转到某个指定位置才停下来
        alert('恭喜中了个'+luck+'等奖');
    }
什么要n=length;然后再i<n;不可以直接i<length吗?为什么用floor(),而不用ceil(),round()?用哪个比较好;var luck = Jiang.splice(rnd, 1);之后,除了赋值给luck,jiang[]也发生了改变?
Shane1994 2018-04-18
  • 打赏
  • 举报
回复
这样子可以么,随机数放到循环里面,如果不中去掉已判断的,再去生成随机数----- var Award=["特","一","二","不中奖"], Weight=[1,2,3,94]; function getSum(a,b){ return a+b;} sum=Weight.reduce(getSum); var result=new String(""); for(var i=0;i<Award.length;i++){ var r=Math.random()*sum; if(r<=Weight[i]){ result=Award[i]; break;} else{ sum-=Weight[i];} } return result;
Hello World, 2018-04-18
  • 打赏
  • 举报
回复
引用 8 楼 YIGOO4 的回复:
[quote=引用 5 楼 apollokk 的回复:]
    var Items = ['特', '一', '二', '三'], Weight = [1, 3, 5, 10], Jiang = [];
    for (var i = 0, n = Weight.length; i < n; i++) {
        for (var j = 0, c = Weight[i]; j < c; j++) {
            Jiang.push(Items[i]);
        }
    }
    function Run() {
        if (Jiang.length == 0) {
            alert('奖已经抽完了');
            return;
        }
        var rnd = Math.floor(Math.random() * Jiang.length);
        var luck = Jiang.splice(rnd, 1);
        //这里可以控制转盘转到某个指定位置才停下来
        alert('恭喜中了个'+luck+'等奖');
    }
什么要n=length;然后再i<n;不可以直接i<length吗?为什么用floor(),而不用ceil(),round()?用哪个比较好;var luck = Jiang.splice(rnd, 1);之后,除了赋值给luck,jiang[]也发生了改变?[/quote] 可以直接i<xx.length,但每次循环都要计算一次length floor是向下取整,ceil是向上取整,round是四舍五入,这里要用向下取整 splice会改变原来的数组,这样就不会重复
天际的海浪 2018-04-18
  • 打赏
  • 举报
回复
引用 9 楼 YIGOO4 的回复:
[quote=引用 1 楼 jslang 的回复:]

var g = ["一等奖","二等奖","三等奖","未中奖"];
var p = [1,5,20,74];
var s = p.reduce(function(pv, v){
	return pv+v;
},0);
var r = Math.random()*s;
for (var i=0, n=0; i < p.length; i++) {
	n += p[i];
	if (n>=r) break;
}
alert(g[i]);
好像还没有考虑到奖项的抽完?[/quote]

<script type="text/javascript">
var g = ["一等奖","二等奖","三等奖","未中奖"];//奖项名称
var p = [1,5,20,74];//奖项的权重。也就是各个奖项的中奖几率占总数的比例。比如这个总数是100,二等奖的中奖几率就是5/100
var t = [1,2,4,0];//奖项个数、一等奖1个,二等奖2个,三等奖4个

function lottery() { //抽奖
	var s = p.reduce(function(pv, v){//计算p数组中数值之和。1+5+20+74是100
		return pv+v;
	},0);
	var r = Math.random()*s;
	for (var i=0, n=0; i < p.length; i++) {
		n += p[i];
		if (n>r) break;
	}
	if (t[i]-->0) {
		alert(g[i]);
	} else {
		alert("未中奖");
	}
}
</script>
<input type="button" value="抽奖" onclick="lottery();" />
天际的海浪 2018-04-17
  • 打赏
  • 举报
回复
引用 2 楼 YIGOO4 的回复:
看不太懂s,能注释一下么,pv,v是代表什么;其实我想知道,关于转盘小游戏的中奖几率是怎么控制的,谢谢

var g = ["一等奖","二等奖","三等奖","未中奖"];//奖项名称
var p = [1,5,20,74];//奖项的权重。也就是各个奖项的中奖几率占总数的比例。比如这个总数是100,二等奖的中奖几率就是5/100
var s = p.reduce(function(pv, v){//计算p数组中数值之和。1+5+20+74是100
	return pv+v;
},0);
var r = Math.random()*s;
for (var i=0, n=0; i < p.length; i++) {
	n += p[i];
	if (n>=r) break;
}
alert(g[i]);

Shane1994 2018-04-17
  • 打赏
  • 举报
回复
看不太懂s,能注释一下么,pv,v是代表什么;其实我想知道,关于转盘小游戏的中奖几率是怎么控制的,谢谢
Hello World, 2018-04-17
  • 打赏
  • 举报
回复
    var Items = ['特', '一', '二', '三'], Weight = [1, 3, 5, 10], Jiang = [];
    for (var i = 0, n = Weight.length; i < n; i++) {
        for (var j = 0, c = Weight[i]; j < c; j++) {
            Jiang.push(Items[i]);
        }
    }
    function Run() {
        if (Jiang.length == 0) {
            alert('奖已经抽完了');
            return;
        }
        var rnd = Math.floor(Math.random() * Jiang.length);
        var luck = Jiang.splice(rnd, 1);
        //这里可以控制转盘转到某个指定位置才停下来
        alert('恭喜中了个'+luck+'等奖');
    }
Shane1994 2018-04-17
  • 打赏
  • 举报
回复
n+=p[i],那如果第一次循环不中,第二次循环中的时候,n=6,二等奖的概率好像是变成6%了吧?好像有点问题,,,能解释一下么,是我理解错了吗
天际的海浪 2018-04-17
  • 打赏
  • 举报
回复
引用 4 楼 YIGOO4 的回复:
n+=p[i],那如果第一次循环不中,第二次循环中的时候,n=6,二等奖的概率好像是变成6%了吧?好像有点问题,,,能解释一下么,是我理解错了吗
权值总和是100。一等奖概率是总值的1%,二等奖概率是总值的5% 也就是随机数r的值是0到1为一等奖,1到6为二等奖 第一次循环不中,说明r大于1,第二次循环中的时候就要判断r是否小于6了
天际的海浪 2018-04-16
  • 打赏
  • 举报
回复

var g = ["一等奖","二等奖","三等奖","未中奖"];
var p = [1,5,20,74];
var s = p.reduce(function(pv, v){
	return pv+v;
},0);
var r = Math.random()*s;
for (var i=0, n=0; i < p.length; i++) {
	n += p[i];
	if (n>=r) break;
}
alert(g[i]);

87,954

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧