使用Javascript随机图像,无需重复

时间:2015-10-17 16:07:03

标签: javascript arrays image random repeat

一直在搜索谷歌得到了大量的结果,但不是我能成功实施。

我使用javascriptkit中的这些代码来显示数组中的随机图像。

<script language="JavaScript">
<!--
function random_imglink(){
var myimages=new Array()

myimages[1]="image1.gif"
myimages[2]="image2.gif"
myimages[3]="image3.gif"
myimages[4]="image4.gif"
myimages[5]="image5.gif"
myimages[6]="image6.gif"

var ry=Math.floor(Math.random()*myimages.length)
if (ry==0)
ry=1

document.write('<img src="'+myimages[ry]+'" border=0>')
}

random_imglink()
//-->
</script>

该脚本运行良好,但有时图像重复(例如img6.gif - &gt; img4.gif - &gt; img4.gif),希望图像显示不会与前一个图像重复。

我对javascript和编程不是很熟悉,这是我第一次玩这个,所以任何帮助都会受到赞赏。

3 个答案:

答案 0 :(得分:2)

一般答案:我认为随机函数的工作方式使得您无法跳过重复图像,除非您从阵列中删除了您使用的图像。因此,一个想法可能是使您的数组成为函数之外的全局变量,并删除您已使用的图像。然后在主函数中,如果删除后数组的大小为零,则可以使用原始图像集重新加载数组。只是一个想法,如果你遇到麻烦就试一试:)

答案 1 :(得分:0)

您可以创建一个数组,您可以在其中存储已使用过的ID。 然后你需要找到不在这个数组中的随机id。

这里有示例代码:

var usedIds = [];
...

var ry = 0;
if(userIds.length != myimages.length) { 
    // If we haven't used all the images
    do {
        ry = Math.floor(Math.random()*myimages.length);
    } while (usedIds.indexOf(ry) > -1);

    // here we have new randomized and unique image id
    usedIds.push(ry);
    // do something with new id
} else {
    // we have already used all the images
}

答案 2 :(得分:0)

&#13;
&#13;
var intervalID;
var showed = {};
var loopCount = 0;

function random_imglink(){
    var myimages=new Array()

    myimages[1]="image1.gif"
    myimages[2]="image2.gif"
    myimages[3]="image3.gif"
    myimages[4]="image4.gif"
    myimages[5]="image5.gif"
    myimages[6]="image6.gif"

    var ry=Math.floor(Math.random()*myimages.length);
    
    if (ry===0) ry=1;
  
      var src = myimages[ry]
      document.body.innerHTML+=('<br>' +  Object.keys(showed).length + '/' +  myimages.length);
  
      // if all images showed 
      if( Object.keys(showed).length === myimages.length - 1 ){
        //                                              |___|
        //                                                ^
        //                                                |
        // this is what i modified -----------------------+
        
        
        
        //we reset the showed cache
        showed = {};
        
        // we increment the loopCount
        loopCount = loopCount + 1;
        if(loopCount === 3 ){
          
          clearInterval( intervalID );
          return;
        }
        document.body.innerHTML+=('<hr>incremting loopCount<hr>');
        
      }
  
      // if this src have been showed we random_imglink;
      if( showed[src] ) return random_imglink();
      
      document.body.innerHTML+=('<br>img src="'+myimages[ry]+'" border=0>');
      
      
      //we store the showed img
      showed[src] = true;
}
document.body.innerHTML+=('we start : <br>');

intervalID = setInterval( random_imglink , 500)
    
&#13;
&#13;
&#13;

我不知道你的约束,但如果你拥有代码,你可以像你想要/需要一样修改它, 一旦你明白上面的方式不是更优化,也许你应该考虑下面这个版本!

&#13;
&#13;
var id;
var i = 0;
var loopCount = 0;

var myimages=[];

// we want a clone array of your myimages[]
// because we want modify it, and keep safe the original.
// it will be copied later
var clonedImages ; 

myimages.push("image1.gif");
myimages.push("image2.gif");
myimages.push("image3.gif");
myimages.push("image4.gif");
myimages.push("image5.gif");
myimages.push("image6.gif");
//       ^
//       |
// Don't have to worry about images index
// Just push in the array in the order you need.


function ran_link(){
  
  // if we have no clone or clone is empty
  // we create it
  if(! clonedImages || ! clonedImages.length ){
    
    
    if(loopCount >= 3) {
      clearInterval(id);
      return;
    }
    
    // we create a clone of myImages
    clonedImages = myimages.slice(0 , myimages.length);
    loopCount= loopCount + 1;
    
    
    document.body.innerHTML+=('<br> loop : ' + loopCount);
    i=0;
  }
  
  // We work here only with the existant element 
  //                                        |
  //                                        V
  var ry =Math.floor(Math.random() * clonedImages.length);
  
  // we extract the element from the array
  // so the array.length will be -1
  var currentImage = clonedImages.splice(ry,1);
  
  // currentImage is an array of 1 element
  // we get the value at index 0
  var currentImageURL = currentImage[0];
  
  document.body.innerHTML+=('<br>' + (i++) + ' : ' + currentImageURL  + ' <==> ' + ry);
  return cur;
  
}


id = setInterval(ran_link , 500);
&#13;
&#13;
&#13;