您的位置:首页 > Web前端 > JavaScript

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

2012-08-03 23:49 483 查看
这个脚本用 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>
    <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>
    <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>
    <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>    
<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>    
<font color="blue" style='font-size:150px' id="num"></font>
<br>
</body>
</html>


很好。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐