我正在尝试使用JavaScript创建一个包含非重复随机字母(仅限大写)的表。有人发布了答案,但在我有机会问之前它被删除了:1)为什么有var x和var y而不是只有var x? 2)为什么把i-1放回字母[i-1]?
HTML5:
<table class="bingo">
<tr>
<td id="square0"></td>
<td id="square1"></td>
<td id="square2"></td>
</tr>
<tr>
<td id="square3"></td>
<td id="square4"></td>
<td id="square5"></td>
</tr>
<tr>
<td id="square6"></td>
<td id="square7"></td>
<td id="square8"></td>
</tr>
</table>
JS
//Create capital letters A - Z array
var letters = [];
for (var i = 65; i < 91; i++) {
letters.push(String.fromCharCode(i));
}
//Confuse about why there is a var x and a var y?
for (var i = 0; i < 26; i++) {
var x = Math.floor(Math.random() * 26);
var y = Math.floor(Math.random() * 26);
var temp = letters[x];
letters[x] = letters[y];
letters[y] = temp;
}
var rLetter = function(i) {
return letters[i-1];
};
window.onload = function () {
//calls the function
$("square0").innerHTML = rLetter(1);
$("square1").innerHTML = rLetter(2);
$("square2").innerHTML = rLetter(3);
$("square3").innerHTML = rLetter(4);
$("square4").innerHTML = rLetter(5);
$("square5").innerHTML = rLetter(6);
$("square6").innerHTML = rLetter(7);
$("square7").innerHTML = rLetter(8);
$("square8").innerHTML = rLetter(9);
}
答案 0 :(得分:0)
var letters = [];
for (var i = 65; i < 91; i++) {
letters.push(String.fromCharCode(i));
}
上面的代码创建了一个数组,其中的字符从A到Z的按字母顺序排列,非随机顺序。
for (var i = 0; i < 26; i++) {
var x = Math.floor(Math.random() * 26);
var y = Math.floor(Math.random() * 26);
var temp = letters[x];
letters[x] = letters[y];
letters[y] = temp;
}
回答您的第一个问题,此代码正在执行的操作是创建两个随机数(x
和y
)以及一个名为temp
的变量来保存letters[x]
的内容。然后,该函数将letters[x]
指定为letters[y]
,然后将letters[x]
指定为letters[y]
。 这个的目的是让letters
数组随机化。
我们说x = 1
和y = 2
:
var temp = 'B'; // because letters[1] = B
letters[1] = 'C'; // because letters[2] = C
letters[2] = 'B'; // because temp = B
现在,letters
数组看起来像:
letters[0] = A
letters[1] = C
letters[2] = B
// etc...
它基本上只是随机化整个数组。
最后,回答你的第二个问题,你放[i-1]
的原因是因为letters
数组索引从0开始。所以当你调用rLEtters(1)
时,它实际上是0(1) -1 = 0)来自letters
数组。
答案 1 :(得分:0)
1)为什么有var x和var y而不是只有var x?
看起来这段代码创建了一个包含所有大写字母的数组,然后通过将2个字母的位置切换26次来“随机化”它们。需要创建2个变量来保存正在切换的2个字母中每个字母的位置。
2)为什么你把i-1放回字母[i-1]?
数组为零索引,表示数组中的第一个值为字母[0]。使用i-1允许您使用rLetter(1)获取数组中的第一个值,而不是获取第二个值。
我个人会这样做:
var usedLetters = [];
var rLetter = function(i) {
var alreadyUsed = 0;
var letter;
while(alreadyUsed >= 0) {
var x = Math.floor(Math.random() * 26);
letter = String.fromCharCode(65 + x);
alreadyUsed = usedLetters.indexOf(letter);
}
usedLetters.push(letter);
return letter;
};
window.onload = function () {
//calls the function
$("square0").innerHTML = rLetter(1);
$("square1").innerHTML = rLetter(2);
$("square2").innerHTML = rLetter(3);
$("square3").innerHTML = rLetter(4);
$("square4").innerHTML = rLetter(5);
$("square5").innerHTML = rLetter(6);
$("square6").innerHTML = rLetter(7);
$("square7").innerHTML = rLetter(8);
$("square8").innerHTML = rLetter(9);
}
抱歉任何代码错误。我对JS的经验很少。
答案 2 :(得分:0)
如果你真的想要一个随机的随机播放(至少在算法上),你就不能做26次随机的字母交换(如另一个答案那样)。
结果有偏见 - 见Implementation errors in Fisher-Yates shuffle&amp;还Jeff Atwood's post on naïveté。
下面,我使用了Mike Bostock对Fisher-Yates shuffle的实现来产生无偏义的随机字母排序(无论如何都达到javascript&#39的随机数生成器的限制)。 / p>
// create array of uppercase letters
var letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');
// implentation of the Fischer-Yeates shuffle
// as written by Mike Bostock (http://bost.ocks.org/mike/shuffle/)
function shuffle(array) {
var m = array.length, t, i;
// While there remain elements to shuffle…
while (m) {
// Pick a remaining element…
i = Math.floor(Math.random() * m--);
// And swap it with the current element.
t = array[m];
array[m] = array[i];
array[i] = t;
}
return array;
}
window.onload = function () {
var shuffled = shuffle(letters);
for (var i=0; i<9; i++) {
$("#square" + i).html(shuffled[i]);
}
}