js控制数组元素随机出现的概率问题

JavaScript09

js控制数组元素随机出现的概率问题,第1张

    var randomNum = function() {

        var arr=['a','b']

        var rand = Math.random()

        if (rand >= 0.5) {

            alert(arr[0])

        }

        else {

            alert(arr[1])

        }

    }

js生成随机数主要用到了内置的Math对象的random()方法。用法如:Math.random()。它返回的是一个 0 ~ 1

之间的随机数。有了这么一个方法,那生成任意随机数就好理解了。比如实际中我们可能会有如下的需要:

(1)生成一个 0 - 100 之间的随机整数,那么则可以:

parseInt(100*Math.random())

注意:因为Math.random()的返回值是包括0和1的,所以这里是有生成0和100的可能性的。

(2)生成一个从 m - n 之间的随机整数,例如要生成一个 5 - 15

之间的随机数,则可以:

parseInt(Math.random()*(15-5+1) + 5)

概括即为:

parseInt(Math.random()*(n-m+1)+m)//生成一个从 m - n 之间的随机整数

另外根据需要总结了另外两种常用到的方法,如下:

(3)生成指定位数的随机整数

function randomNum(n){

var t=''

for(var i=0i<ni++){

t+=Math.floor(Math.random()*10)

}

return t

}

(4)生成指定范围内的随机整数

function randomNum(minNum,maxNum){

switch(arguments.length){

case 1:

return parseInt(Math.random()*minNum+1)

break

case 2:

return parseInt(Math.random()*(maxNum-minNum+1)+minNum)

break

default:

return 0

break

}

}

例如生成 2 - 9之间的随机整数,则:randomNum(2,9),生成 1 - 22之间随机整数,则:randomNum(22)

①从0~6中生成3个随机数。

②判断3个随机数是否相等,不相等则执行隐藏操作。

③3随机数有重复,则重新执行函数。

实现:生成0~6的一个随机数

复制代码

代码如下:

var ran1=parseInt(Math.random()*7)

//Math.random()生成[0,1)的一个随机数

完整代码:

<!DOCTYPE html>

<html>

<head>

<meta http-equiv="Content-Type" content="text/htmlcharset=utf-8" />

<script language="javascript" type="text/javascript" src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script>

<title>挑战题</title>

</head>

<body>

<ul>

<li>0</li>

<li>1</li>

<li>2</li>

<li>3</li>

<li>4</li>

<li>5</li>

<li>6</li>

<li>7</li>

</ul>

<a id="btn" onclick="cli()">简化</a>

</body>

<script>

$(function cli(){

$("#btn").css("cursor","pointer")

if($("#btn").html()=="简化"){

var ran1=parseInt(Math.random()*7)

var ran2=parseInt(Math.random()*7)

var ran3=parseInt(Math.random()*7)//①从0~6中生成3个随机数完成

if(ran1!=ran2&&ran1!=ran2&&ran2!=ran3){ //②判断3个随机数是否相等,不相等则执行操作。

$('li:eq('+ran1+')').css('display','none')

$('li:eq('+ran2+')').css('display','none')

$('li:eq('+ran3+')').css('display','none')

$("#btn").html("更多")

}else{//③3随机数有重复,则重新执行函数。

cli()

}

}

else{

$("li:hidden").css('display','list-item')

$("a:contains('更多')").html("简化")

}

})

</script>

</html>

收获一:

复制代码

代码如下:

var

ran=parseInt(Math.random()*(max-min+1)+min)//生成一个[min,max]区间的一个随机数

收获二:

反思了下,决定写个在一定[min,max]区间,生成n个不重复的随机数的封装函数。

思路一:先生成n个[min,max]区间随机数,比较是否重复,如重复则返回,再次执行。

演示地址:http://jsbin.com/yupuyehuqa/edit?html,js,output

封装函数:

function my_ran(n,min,max){

var arr=[]

for(i=0i<ni++){

arr[i]=parseInt(Math.random()*(max-min+1)+min)

}

for(i=0i<ni++){

for(j=i+1j<nj++){

if(arr[i]==arr[j]){

my_ran(n,min,max)

return fault

}

}

}

return arr

}

思路二:生成第i个[min,max]区间的随机数,并与之前i-1个数比较,如有重复,令i=i-1重复生成第i个随机数。

演示地址:http://jsbin.com/zorunotosi/edit?html,js,output

封装函数:

function my_ran2(n,min,max){

var arr=[]

for(i=0i<ni++){

arr[i]=parseInt(Math.random()*(max-min+1)+min)

for(j=0j<ij++){

if(arr[i]==arr[j]){

i=i-1

break

}

}

}

return arr

}

思路三:生成[min,max]区间的一个顺序数组,打乱数组,输出前n个值。

演示地址:http://jsbin.com/zorunotosi/edit?html,js,output

封装函数:

function my_ran3(n,min,max){

var arr=[]

var arr2=[]

for(i=0i<max-min+1i++){

arr[i]=i+min

}

for(var j,x,i=arr.lengthij=parseInt(Math.random()*i),x=arr[--i],arr[i]=arr[j],arr[j]=x)

for(i=0i<ni++){

arr2[i]=arr[i]

}

return arr2

}

思路四:生成[min,max]区间的一个顺序数组,从中随机选出一个值,然后在数组中删掉这个值,再选第二个随机值。

演示地址:http://jsbin.com/zorunotosi/edit?html,js,output

封装函数:

function my_ran4(n,min,max){

var arr=[]

var arr2=[]

for(i=0i<max-min+1i++){

arr[i]=i+min

}

for(i=0i<ni++){

var x=parseInt(Math.random()*arr.length)

arr2[i]=arr[x]

for(j=xj<arr.lengthj++){

arr[j]=arr[j+1]

}

arr.length=arr.length-1

}

return arr2

}