桌子上不重复的随机字母

时间:2015-08-12 00:44:40

标签: javascript html5

我正在尝试使用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);

}

3 个答案:

答案 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;
}

回答您的第一个问题,此代码正在执行的操作是创建两个随机数(xy)以及一个名为temp的变量来保存letters[x]的内容。然后,该函数将letters[x]指定为letters[y],然后将letters[x]指定为letters[y]这个的目的是让letters数组随机化。

我们说x = 1y = 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]);
    }

}

Codepen here

相关问题