用 javascript 实现随机抽奖 ( 从 1 到 输入值之间任取一个整数值)

这个脚本用 javascript 实现随机抽奖 ( 从 1 到 输入值之间任取一个整数值)。

比如输入10, 点击 Start 就会显示从1到10之间的随机整数。

<html>
<head>
<title>randomnumber.html</title>
<script type="text/javascript">
    //该脚本实现了从1到100之间随机数
    function count() {
        if (document.getElementById("max").value.length > 0) {
            max = document.getElementById("max").value; //max, 全局变量
        } 
        else {
            max = 0;
            return false;
        }
        document.getElementById("num").innerHTML = 1 + parseInt(max * Math.random());
    }

    function start() {
        if (document.getElementById("max").value == 0) //此处是判断如果输入0,则提示用户
        //输入正整数,并不执行count()
        {
            alert("Positive integer is required.");
            return false;
        } 
        else
        {
            timeId = setInterval("count();", 100);//timeId 是个全局变量(没有 var) 而不是
            //局部变量。整体的含义是,每隔 xx 毫秒执行一次 count()
        }
    }
    function stop() {
        clearInterval(timeId);
    }
</script>
</head>

<body>
    <form>
        <input type="text" style='font-size:34px' id="max"> <br><br>
        <input type="button" style='font-size:40px' value="Start" onclick="start()">
        <input type="button" style='font-size:40px' value="Stop" onclick="stop();">
        <input type="reset" style='font-size:40px' value="Reset">
    </form>
    <br>
    <font color="blue" style='font-size:250px' id="num">0</font>
</body>
</html>

结果大家自己试试

但是上面 script 有的 bug 是,文本框 应该只接受正整数,而脚本没有对输入是否为字符串,负数,小数进行验证。

于是更改如下:

<html>
<head>
<title>randomnumber.html</title>
<script type="text/javascript">
    //该脚本实现了从 1 到 xx 正整数之间随机数
    var errorString = "Please input a positive integer.";
    function count() {
        if (document.getElementById("max").value.length > 0) 
     { max
= document.getElementById("max").value; //max, 全局变量 } else
     { max
= 0; return false; } document.getElementById("num").innerHTML = 1 + parseInt(max * Math.random()); } function start() { if(isNaN(document.getElementById("max").value))//如果输入的不是数字,则报错。 { alert(errorString); return false; } if (document.getElementById("max").value.toString().indexOf(".") >0)//如果输入小数 //也就是包含了 ".", 则报错。 { alert(errorString); return false; } if (document.getElementById("max").value < 1) //此处是判断如果输入0或负整数,则提示用户 //输入正整数,并不执行count() { alert(errorString); return false; } else { timeId = setInterval("count();", 100);//timeId 是个全局变量(没有 var) 而不是 //局部变量。整体的含义是,每隔 xx 毫秒执行一次 count() } } function stop() { clearInterval(timeId); } </script> </head> <body> <form> <input type="text" style='font-size:34px' id="max" onKeyPress="if(event.keyCode==13){start();};"> <!-- 上面 event.keyCode==13是指如果按Enter 键,则。。。 --> <br><br> <input type="button" style='font-size:40px' value="Start" onclick="start()"> <input type="button" style='font-size:40px' value="Stop" onclick="stop();"> <input type="reset" style='font-size:40px' value="Reset"> </form> <br> &nbsp;&nbsp;&nbsp;&nbsp;<font color="blue" style='font-size:250px' id="num">0</font> </body> </html>

这回基本完成了。但是仍然有一个问题。

就是如果我们输入一个很大的值,比如9999999999999999999999(22个9),结果在大部分事件都是1位数,也就是1-9。如果我们减少一个9(21个9),那么几乎所有结果都是最后4位为0.

这应该是和 Random()函数本身的算法有关系。

为了让结果更好一些,通过实验,我应该把输入数字的Length限制在14以内。
结果如下

<html>
<head>
<title>randomnumber.html</title>
<script type="text/javascript">
    //该脚本实现了从 1 到 xx 正整数之间随机数
    var errorString1 = "Please input a positive integer.";
    var errorString2 = "Input is too big.";
    
    function count() {
        if (document.getElementById("max").value.length > 0) //如果文本框输入了值
        {
            max = document.getElementById("max").value; //max, 全局变量
        } 
        else //如果文本框没输入值,设置 max为0
        {
            max = 0;
            return false;
        }
        document.getElementById("num").innerHTML = 1 + parseInt(max * Math.random());
    }

    function start() {
        if(isNaN(document.getElementById("max").value))//如果输入的不是数字,则报错。
        {
        alert(errorString1);
        return false;
        }
        if (document.getElementById("max").value.toString().indexOf(".") >0)//如果输入小数
        //也就是包含了 ".", 则报错。
        {
        alert(errorString1);
        return false;
        }
        if (document.getElementById("max").value < 1) //此处是判断如果输入0或负整数,则提示用户
        //输入正整数,并不执行count()
        {
            alert(errorString1);
            return false;
        }
        if (document.getElementById("max").value.length > 14)//允许输入的最大程度为14
        {
            alert(errorString2);
            max = 0;
            return false;
        }
        else
        {
            timeId = setInterval("count();", 100);//timeId 是个全局变量(没有 var) 而不是
            //局部变量。整体的含义是,每隔 xx 毫秒执行一次 count()
        }
    }
    function stop() {
        clearInterval(timeId);
    }
</script>
</head>

<body>
    <form>
        <input type="text" style='font-size:34px' id="max" onKeyPress="if(event.keyCode==13){start();};">
        <!-- 上面 event.keyCode==13是指如果按Enter 键,则。。。 -->
        <br><br>
        <input type="button" style='font-size:40px' value="Start" onclick="start()">
        <input type="button" style='font-size:40px' value="Stop" onclick="stop();">
        <input type="reset" style='font-size:40px' value="Reset">
    </form>
    <br>
    &nbsp;&nbsp;&nbsp;&nbsp;<font color="blue" style='font-size:50px' id="num">0</font>
</body>
</html>

好了。这回基本上没有bug了。

但是我们其实对于 max TextField 限制输入14个字符有更好的方法。同时我们还希望一旦弹出错误消息后能够清空 max TextField 并设置焦点在它上面。看下面

<html>
<head>
<title>random number</title>
<script type="text/javascript">
    //该脚本实现了从 1 到 xx 正整数之间随机数
    var errorString = "Please input a positive integer.";
    function count() {
        if (document.getElementById("max").value.length > 0) 
     {
            max = document.getElementById("max").value; //max, 全局变量
        } 
        else 
     {
            max = 0;
            return false;
        }
        document.getElementById("num").innerHTML = 1 + parseInt(max * Math.random());
    }

    function start() {
        if(isNaN(document.getElementById("max").value))//如果输入的不是数字,则报错。
        {
        alert(errorString);
        document.forms[0].elements[0].value = ""; //清空 "max" TextField
        document.forms[0].elements[0].focus();//把焦点设置到 max TextField
        //document.getElementById("max").value="";//清空 "max" TextField
        //document.getElementById("max").focus();//把焦点设置到 max TextField
        return false;
        }
        if (document.getElementById("max").value.toString().indexOf(".") >0)//如果输入小数
        //也就是包含了 ".", 则报错。
        {
        alert(errorString);
        document.forms[0].elements[0].value = ""; //清空 "max" TextField
        document.forms[0].elements[0].focus();//把焦点设置到 max TextField
        //document.getElementById("max").value="";//清空 "max" TextField
        //document.getElementById("max").focus();//把焦点设置到 max TextField
        return false;
        }
        if (document.getElementById("max").value < 1) //此处是判断如果输入0或负整数,则提示用户
        //输入正整数,并不执行count()
        {
        alert(errorString);
        document.forms[0].elements[0].value = ""; //清空 "max" TextField
        document.forms[0].elements[0].focus();//把焦点设置到 max TextField
        //document.getElementById("max").value="";//清空 "max" TextField
        //document.getElementById("max").focus();//把焦点设置到 max TextField
        return false;
        } 
        else
        {
            timeId = setInterval("count();", 100);//timeId 是个全局变量(没有 var) 而不是
            //局部变量。整体的含义是,每隔 xx 毫秒执行一次 count()
        }
    }
    function stop() {
        clearInterval(timeId);
    }
</script>
</head>

<body>
    <form>
        <input type="text" style='font-size:34px' maxlength="14" id="max" >
        <!-- 上面 event.keyCode==13是指如果按Enter 键,则。。。 -->
        <br><br>
        <input type="button" style='font-size:40px' value="Start" onclick="start()">
        <input type="button" style='font-size:40px' value="Stop" onclick="stop();">
        <input type="reset" style='font-size:40px' value="Reset">
    </form>
    <br>
    &nbsp;&nbsp;&nbsp;&nbsp;<font color="blue" style='font-size:150px' id="num">0</font>
</body>
</html>

我们在看一个随机抽取人名:

<html>
<head>
<title>random number</title>
<script type="text/javascript">
    //随机抽取人名
    var errorString = "Please input a positive integer.";
    var arr = ["Alan C", "Alan T", "Cheney Ma", "Simon Zhao",
    "Jeade Kong", "Shawn Shang", "Phil Lew", "Jan", "Misly"];
    
    function count() {
        max = arr.length; //max, 全局变量
        document.getElementById("num").innerHTML = arr[parseInt(max * Math.random())];
    }

    function start()
    {
        timeId = setInterval("count();", 100);
    }
    function stop() {
        clearInterval(timeId);
    }
</script>
</head>

<body>
    <form>
        <input type="button" style='font-size:40px' value="Start" onclick="start()">
        <input type="button" style='font-size:40px' value="Stop" onclick="stop();">
    </form>
        <br>&nbsp;&nbsp;&nbsp;&nbsp;
        <font color="blue" style='font-size:150px' id="num"></font>
    <br>
</body>
</html>

这个就是随机抽取 hard code 好的人名。

上面还是有个 bug。就是如果连续点击 Start 。然后再 点击 Stop。Stop 则不好使。下面 fix 了这个 bug。

<html>
<head>
<title>random number</title>
<script type="text/javascript">
    //随机抽取人名
    var errorString = "Please input a positive integer.";
    var arr = ["Alan C", "Alan T", "Cheney Ma", "Simon Zhao",
    "Jeade Kong", "Shawn Shang", "Phil Lew", "Jan", "Misly"];
    max = arr.length; //max, 全局变量    
    var flag = true;
    
    function count() {
        document.getElementById("num").innerHTML = arr[parseInt(max * Math.random())];
    }

    function start()
    {
        if (flag == true)
        {
        timeId = setInterval("count();", 100);
        flag = false;
        }
        else
        {}
    }
    function stop() {
        clearInterval(timeId);
        flag = true;
    }
</script>
</head>

<body>
    <form>
        <input type="button" style='font-size:40px' value="Start" onclick="start()">
        <input type="button" style='font-size:40px' value="Stop" onclick="stop();">
    </form>
        <br>&nbsp;&nbsp;&nbsp;&nbsp;
        <font color="blue" style='font-size:150px' id="num"></font>
    <br>
</body>
</html>

很好。

原文地址:https://www.cnblogs.com/backpacker/p/2622426.html