在我之前举办的两次赠书活动中,我承诺将从评论中随机抽取一位获胜者。 评论有数百条,所以我不会把数字写在小纸片上然后从帽子中抽取。 我实际上有一个掷骰子的 iPhone 应用程序打算使用,但后来我想,我为什么不快速构建一个网页来完成它呢?
我将此帖子的演示移动到了这个 CodePen,它更加实用,尽管使用 jQuery 等略显老派。 我将保留帖子的其余部分基本不变。
这是一个没有使用 jQuery 的版本……
JavaScript 随机数
使用 JavaScript 生成随机数非常简单
var numRand = Math.floor(Math.random() * 101);
这将返回 1 到 100 之间的随机数。但我希望使这个网站更有用,它将接收一个较低值和一个较高值,并返回这两个值之间的随机数。
HTML
几个文本输入框、一个“生成!”按钮和一个用于放置数字的空 div 容器就足够了
<input type="text" id="lownumber" value="1" />
and
<input type="text" id="highnumber" value="100" />
<br />
<input type="submit" id="getit" value="Generate!" />
<div id="randomnumber"></div>
jQuery
当单击“生成!”按钮时,我们将执行操作
$("#getit").click(function() {
var numLow = $("#lownumber").val();
var numHigh = $("#highnumber").val();
var adjustedHigh = (parseFloat(numHigh) - parseFloat(numLow)) + 1;
var numRand = Math.floor(Math.random()*adjustedHigh) + parseFloat(numLow);
if ((IsNumeric(numLow)) && (IsNumeric(numHigh)) && (parseFloat(numLow) <= parseFloat(numHigh) && (numLow != '') && (numHigh != '')) {
$("#randomnumber").text(numRand);
} else {
$("#randomnumber").text("Careful now...");
}
return false;
});
我认为最简单的方法是从高值中减去低值,生成 1 到该差值之间的随机数,然后再加上低值。为了确保其正常工作,我们需要检查各种情况
- 输入框不为空且为数字
- 第一个数字小于第二个数字
我使用了这个经典的 IsNumeric 函数来检查它们是否确实是数字:感谢 James 更新的 IsNumeric 函数(简单 10 倍)
function isNumeric(n){
return !isNaN(n);
}
作为最后的润色,我希望在其中包含默认数字 1 和 100,但易于更改。因此,只要您切换到或单击任一元素,它就会清除数字并将颜色更改为黑色。它还确保如果您再次切换到或单击该处,它将不会执行此操作。
$("input[type=text]").each(function(){
$(this).data("first-click", true);
});
$("input[type=text]").focus(function(){
if ($(this).data("first-click")) {
$(this).val("");
$(this).data("first-click", false);
$(this).css("color", "black");
}
});
请使用伪随机数。
好吧,吹毛求疵的船长……
感谢演示;很高兴能获得代码、演示和说明。一点说明……演示似乎是包含的,这可能是意图,但“之间”通常意味着最小值/最大值被排除在外。我想这可能因个人定义而异。感谢演示。
一如既往,Chris!谢谢这个。
您那里存在问题:)。尝试(例如)在 7 到 15 的范围内生成随机数。将会出现错误。此外:尝试输入 123 到 21 的范围。它将生成一个数字。您的问题是:您正在比较字符串。
在第 31 行,您有 (numLow <= numHigh)。它应该是 (parseInt(numLow, 10) <= parseInt(numHigh, 10)),以便 JS 比较整数。
发现得很好,谢谢!
你甚至不能输入负数
此外,我们始终可以使用 random.org……
您的“isNumeric”函数有点过头了!JavaScript 为我们提供了 isNaN(isNotANumber)方法,所以为什么不这样包装呢
function isNumeric(n){return !isNaN(n);}
忘记了 isNaN。我本来想建议使用正则表达式:)
return !n.match(/[^\d*]/g);
正则表达式比 isNaN 好得多
还要将您的 isNummeric 函数放在您的 $() 内部,这样就不会弄乱全局命名空间。
谢谢 James,显然这要容易得多,已更新!
小题大做!不过应用不错。我选择评论获胜者的方法是,从评论表中随机选择一封电子邮件或一个姓名,其中帖子等于帖子 ID,并使用 RAND() 和 LIMIT 使用 SQL 随机提取一个人。
伪随机数将是真实的(笑)。
但我有一个问题,脚本的目标是生成一个整数,对吧?那么为什么使用 parseFloat 而不是 parseInt(userInput, 10)(不要忘记基数),因为如果我们使用您编写的脚本,并且我们将(例如)2.5 作为较低数字,2.75 作为较高数字,然后生成几次以获取随机整数,您有时会看到 3.5,这不是整数,并且超出范围;)
抱歉我的英语;)
我在 ff 3.0.7 中遇到错误
它没有为我留下数字。当我提交时,它只是恢复到默认值。
我也是
我错了,正在修改它以修复其他问题,现在好了。
您真的需要加载整个 jQuery 库吗?据我所见,它仅用于可以用标准 DOM JS 完成的事情。
几个月前我创建了类似的东西,我使用了大约 10 行纯 JavaScript……
jQuery 非常酷,但在这种情况下,我认为它有点小题大做。
无论如何,感谢分享您的知识!;)
您提供代码真是太好了,但我们想要一些不随机的东西。我开玩笑的。
Cris,
那是什么字体?
Chris*
抱歉
嗨,
这个演示很棒,也很有用:)
谢谢 Chris :D
但我想问一个问题!我怎样才能让它只在第一次点击时工作?
我的意思是让它只在**第一次点击**时获取一个随机数?
我对这项伟大的工作表示感谢……“^^”
继续努力……祝一切顺利。
所以,我赢了那本书吗?
使用该代码,范围将是 0 到 100
var numRand = Math.floor(Math.random()*101)
.random 生成:0 <= N < 1