【问题标题】:Text shuffle on reload [duplicate]重新加载时的文本随机播放[重复]
【发布时间】:2013-07-26 15:16:12
【问题描述】:
<div id="t1"></div>
<div id="t2"></div>

所以在这两个 div 中我想旋转 4 行文本...显然我尝试设置它的方式不起作用,在 t2 div 只是复制 t div 之前...任何想法如何解决这个问题?如果我在听另一种方式,我不会精通编码,更多的是复制粘贴调整测试类型的编码......这是我试图在我的网站上制作的一个简单游戏,所以我正在寻找解决方案...

<script type="text/javascript">
var scn = new Array();
scn[0] = "red";
scn[1] = "blue";
scn[2] = "green";
scn[3] = "yellow";
var myRandom = Math.floor(Math.random()*scn.length);
//$(document).ready(function() {
$('#t1').html(scn[myRandom]);
$('#t2').html(scn[myRandom]); 
//});
</script>

【问题讨论】:

  • 只需两次生成随机数并在 diff div 中设置。
  • 我不确定您的要求:您是否希望两个 div 各自包含您拥有的字符串之一,从列表中随机选择,并且不相互重复?所以给定你的四个字符串数组,第一个 div 有四个字符串中的任何一个,第二个 div 有其余三个字符串中的任何一个?
  • 第二次可能会检查数字是否不同,或者有时您可能会得到相同的文本
  • 如果您对免费提供帮助的人投反对票,他们就不太可能提供帮助。您至少可以就给定答案的问题发表评论。
  • 我想让 div 旋转文本但从不同时显示相同的文本字符串...

标签: javascript jquery html


【解决方案1】:

如果我对问题陈述的理解正确,那么您所需要的就是改组算法的基本变体。您需要来自起始数组的两个元素,无需替换。

目前最有效的洗牌算法是所谓的 Fisher-Yates 洗牌,它的复杂度为 n 阶 - 也就是说,它所花费的时间和空间与您正在处理的元素数量大致成正比和。它的工作原理是在数组中取一个随机元素并将其与第一个交换;然后,它在数组第一个之后取一个随机元素并将其与第二个交换;等等。你得到一个完美的(伪)随机数组,每个元素都需要一个逻辑操作。

如果你打乱数组,然后从中取出前两个元素,你可以将它们呈现在两个 div 中。

Mike Bostocks 很好地实现了 Fisher-Yates 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;
}

如果我们通过它运行您的数组 scn,然后将前两个元素放入 div 中,您将得到您要查找的内容。

<script type="text/javascript">
var scn = ["red", "blue", "green", "yellow"];  // or whatever array, doesn't matter
$(document).ready(function() {
  shuffle(scn);
  $('#t1').html(scn[0]);
  $('#t2').html(scn[1]); 
});

// insert shuffle function code here
</script>

天真的方法是从 1-4 中取一个随机数两次,确保它们不相等,然后以这种方式从数组中提取元素,但如果您打算在游戏中使用此代码,改组算法更具可扩展性——只需调整数组的大小和要插入的 div,就可以拥有一组任意大小。

【讨论】:

  • 试过了,效果很好!我正在用 4 个 div 尝试它,它总是随机播放,从来没有 2 个相同...谢谢!
  • 太好了,很高兴听到这个消息!当您找到满意的答案时,请继续接受它。
【解决方案2】:

以一种非常简单的方式,您可以删除第一个选定的元素:

var scn = [];
scn[0] = "red";
scn[1] = "blue";
scn[2] = "green";
scn[3] = "yellow";
var myRandom = Math.floor(Math.random() * scn.length);
$(document).ready(function() {
    $('#t1').html(scn[myRandom]);
    scn.splice(myRandom, 1); // remove one element at "myRandom" index
    myRandom = Math.floor(Math.random() * scn.length);
    $('#t2').html(scn[myRandom]);
});

【讨论】:

  • 如果要求永不重复,我也会这样做。 +1
【解决方案3】:

漂亮而简单。 demo

var scn = ['red', 'blue', 'green', 'yellow'];

$(function() {
  var rand1 = Math.floor(Math.random() * scn.length),
      rand2 = rand1 === scn.length-1 ? 0 : rand1 + 1;
  $('#t1').html(scn[rand1]);
  $('#t2').html(scn[rand2]);
});

这个想法是rand2 将始终是数组中rand1 之后的“下一个”值


有点复杂demo

var scn = ['red', 'blue', 'green', 'yellow'],

getRand = function(check){
  var res = Math.floor(Math.random() * scn.length);
  if(res == check){ return getRand(check); }
  else{ return res; }  
};

$(function() {
  var rand1 = getRand(),
      rand2 = getRand(rand1);
  $('#t1').html(scn[rand1]);
  $('#t2').html(scn[rand2]);
});

我们可以使用递归函数来产生第二个不是第一个的随机数。

【讨论】:

  • 此解决方案确实会产生随机结果,但它并不完整。你只得到与数组长度一样多的排列(在本例中为四个),如果你得到最后一个,第二个 div 是空的。我得到红色/蓝色、蓝色/绿色、绿色/黄色或黄色/空白之一。
  • 嗯没有。再读一遍,永远不会有空白
  • 请注意,这些是我在您链接到的同一个演示中反复试验的结果。 rand1 只会在集合 [0, scn.length - 1] 中,这意味着您的条件永远不会为真。如果将三元表达式中的 scn.length 替换为 (scn.length - 1),它将为您提供所需的内容(无空格),但第二个 div 中的值仍取决于第一个。
  • @JimDagg 你是对的,我错过了-1。答案和代码笔更新
  • @JimDagg 我现在还提供了第二个答案,它确实更随机,带有递归函数。
【解决方案4】:

var getColor = function() {
  return scn[Math.floor(Math.random()*scn.length)]
}
$('#t1').html(getColor())
$('#t2').html(getColor())

【讨论】:

  • 因为你可能仍然会得到两次相同的颜色。
猜你喜欢
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
  • 2017-10-14
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
  • 2012-12-16
  • 2017-11-11
相关资源
最近更新 更多