我有一系列硬编码名称不会改变。也只有2个值。
我需要遍历数组并随机选择一个值,但永远不会返回相同的值两次。
我目前的代码是:
var pick_url = new Array('url_1', 'url_2');
var picked_url_to_use = pick_url[Math.floor(Math.random() * pick_url.length)];
var base_url = picked_url_to_use;
console.log(base_url);
这样可以正常工作,但有时会多次返回相同的值。
有人可以帮忙解决这个问题吗?
答案 0 :(得分:1)
如果您想知道返回了哪些值,可以选择两种常规选项:
您可以从pick_url
数组中删除返回的项目,因此无法再返回。
为此,请查看javascript的splice
函数:http://www.w3schools.com/jsref/jsref_splice.asp
您还可以跟踪已在单独数组中返回的内容。然后,当你得到第二个网址时,检查它是否已经发送过。如果有,请选择一个新的随机项,然后重新检查。 从理论上讲,如果随机选择已经使用过的物品,这可能需要很长时间。
我会选择第一个选项,因为它更快,不需要重复。
答案 1 :(得分:1)
var pick_url = ['url_1', 'url_2'];
var base_url = picked_url = pick_url.splice(Math.floor(Math.random() * pick_url.length), 1).join();
编辑:我不确定您是否要始终返回url_1然后返回url_2,或随机网址然后返回其他网址?
以下内容应返回随机网址,然后是后续通话中的下一个网址:
function rurl() { var picked_url = pick_url.splice(Math.max(0, Math.floor(Math.random() * pick_url.length)), 1).join(); return picked_url; }
如果您希望它始终返回url_1然后返回url_2,请将Math.max更改为Math.min,或者更好的是,只需执行pick_url.splice(0,1).join();
答案 2 :(得分:0)
如果你在数组中确实总是有两个值:
var pick_url = new Array('url_1', 'url_2');
var random_index1 = Math.floor( Math.random() * 2 );
var random_index2 = Math.abs( random_index1 - 1 );
console.log( pick_url[ random_index1 ] ); // either url_1 or url_2
console.log( pick_url[ random_index2 ] ); // always the other url