0

我有一组不会改变的硬编码名称。也只有 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);

这工作正常,但有时会多次返回相同的值。

任何人都可以帮助解决这个问题吗?

4

3 回答 3

1

如果您想知道返回了哪些值,可以选择两个常规选项:

您可以从数组中删除返回的项目pick_url,因此无法再返回。为此,请查看splicejavascript 的功能:http: //www.w3schools.com/jsref/jsref_splice.asp

您也可以只跟踪已在单独数组中返回的内容。然后,当您获得第二个 url 时,检查它是否已经发送过。如果有,请选择一个新的随机项目,然后重新检查。从理论上讲,如果您随机选择已经使用过的物品,这可能需要很长时间。

我会选择第一个选项,因为它更快并且不需要重复。

于 2013-03-08T11:22:23.887 回答
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,还是要返回随机 URL,然后再返回另一个?

以下应返回一个随机 URL,然后在后续调用中返回下一个 URL:

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();

于 2013-03-08T11:56:38.607 回答
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

演示:http: //jsfiddle.net/jGurr/

于 2013-03-08T11:25:31.897 回答