随机化数组元素并使用javascript在时间间隔中选择一个

时间:2015-07-01 08:51:00

标签: javascript arrays random

我编写了一段代码,可以从数组中随机选择一个元素,并在某个时间间隔内连续循环脚本。当我运行它,它可以工作,但浏览器冻结,所以它的代码不好。它基于Fisher-Yates算法。这是代码:



function random_notes(x){
    
    	var frame = document.getElementById("frame");
    	var my_array = ['E', 'G' , 'A', 'C', 'D', 'G#', 'F', 'C#', 'D#', 'A#', 'F#','B'];
    	var ri = Math.floor(Math.random() * my_array.length);
    	var result = my_array[ri];
    
    	var div = document.getElementById('frame');
    	div.innerHTML= result;
    
    	setTimeout("random_notes()",x*1000); // x represent a seconds
    	return random_notes();
    
    }

<input type= "submit" value= "submit" onSubmit="random_notes(2)">
&#13;
&#13;
&#13;

和HTML

带ID框的Div也在HTML中定义。 你能帮我优化一下吗?谢谢!

2 个答案:

答案 0 :(得分:0)

function random_notes(x, refreshId){

var frame = document.getElementById("frame");
var my_array = ['E', 'G' , 'A', 'C', 'D', 'G#', 'F', 'C#', 'D#', 'A#', 'F#','B'];
var div = document.getElementById('frame');

refreshId = setInterval(function() {

        var ri = Math.floor(Math.random() * my_array.length);
        var result = my_array[ri];

        div.innerHTML= result;

    }, x*1000);

}

用x作为延迟来调用它,并刷新一个var,这样你就可以从外面停止循环了。例如

var tmp;
random_notes(10, tmp);
if (something) clearInterval(tmp);

编辑:在setInterval之外移动DOM getElementById以加快速度

答案 1 :(得分:0)

&#13;
&#13;
"ABC" + "" + "hi%" + "" +vbCRLF + "bcd" 
&#13;
addEventListener("DOMContentLoaded", function(event) {
  var span_randomElement = document.getElementById("span_randomElement");
  var button_getRandomElement = document.getElementById("button_getRandomElement");
  
  var elements = 'E G A C D G# F C# D# A# E# B'.split(' ');
  
  var multiplier = 1;  
  var seconds = 1000 * multiplier;
  
  var randomNumber = 0;
  var lastRandomNumber = 0;
  
  function start_gettingRandomNumber() {
    setInterval(function(){    
      do {
        randomNumber = Math.floor((Math.random() * (elements.length - 1)) + 0);
      }while(randomNumber == lastRandomNumber);
    
      lastRandomNumber = randomNumber;
      
      span_randomElement.innerHTML = elements[randomNumber];
    
    }, seconds);
  }  
  
  button_getRandomElement.addEventListener("click", function() {
    start_gettingRandomNumber();
    alert("Getting random letter every " + multiplier + " seconds...");
  });
  
  
});
&#13;
&#13;
&#13;

我制作了一个脚本,点击一个按钮即可获得随机信件。我添加了一个<div> <button id="button_getRandomElement">Get a random element</button> <span id="span_randomElement"></span> </div>,以确保在所有元素都被加载后我会获取元素。

修改

添加了适当的&#34;笔记&#34;数组,我没有想到我们在谈论音乐,并缩短了每个音程之间的时间。

编辑2

通过 Michael Geary

的建议进行编辑