Javascript 如何生成新的随机数(与以前的随机数不同)
我正在尝试更改以下内容(当前从数组返回一个随机数),以便每个随机数与最后选择的随机数不同Javascript 如何生成新的随机数(与以前的随机数不同),javascript,Javascript,我正在尝试更改以下内容(当前从数组返回一个随机数),以便每个随机数与最后选择的随机数不同 function randomize(arr) { return arr[Math.floor(Math.random()*arr.length)]; } oracleImg = []; for (var i=1;i<=6;i++) { oracleImg.push(i); } randOracleI
function randomize(arr) {
return arr[Math.floor(Math.random()*arr.length)];
}
oracleImg = [];
for (var i=1;i<=6;i++) {
oracleImg.push(i);
}
randOracleImg = randomize(oracleImg);
如何修复此问题?您现有函数的递归
randomize()
调用没有意义,因为您没有将arr
参数传递给它,也没有对其返回值进行任何处理。这条线应该是:
return randomize(arr);
…但当它到达该行时,您已重新分配了arr
,因此它不再引用原始数组。在下面的版本中使用一个附加变量应该可以工作
注意,我还添加了一个测试,以确保如果数组只有一个元素,我们会立即返回该项,因为在这种情况下,不可能每次都选择不同的项。(如果数组为空,则函数返回undefined
)
函数随机化(arr){
如果(arr.length<2)返回arr[0];
var num=Math.floor(Math.random()*arr.length);
如果(num==this.lastSelected){
返回随机化(arr);
}否则{
this.lastSelected=num;
返回arr[num];
}
}
document.querySelector(“按钮”).addEventListener(“单击”,函数)(){
日志(随机化([“a”、“b”、“c”、“d”));
});代码>
Test
现有函数的递归randomize()
调用没有意义,因为您没有将arr
参数传递给它,也没有对其返回值进行任何处理。这条线应该是:
return randomize(arr);
…但当它到达该行时,您已重新分配了arr
,因此它不再引用原始数组。在下面的版本中使用一个附加变量应该可以工作
注意,我还添加了一个测试,以确保如果数组只有一个元素,我们会立即返回该项,因为在这种情况下,不可能每次都选择不同的项。(如果数组为空,则函数返回undefined
)
函数随机化(arr){
如果(arr.length<2)返回arr[0];
var num=Math.floor(Math.random()*arr.length);
如果(num==this.lastSelected){
返回随机化(arr);
}否则{
this.lastSelected=num;
返回arr[num];
}
}
document.querySelector(“按钮”).addEventListener(“单击”,函数)(){
日志(随机化([“a”、“b”、“c”、“d”));
});代码>
Test
下面的代码只是一个示例,它将生成99个数字,并且所有数字都是唯一和随机的(范围为0-1000),逻辑很简单,只需在临时数组中添加随机数,然后比较新的随机数(如果已经生成或没有)
var tempArray=[];
var i=0;
而(i!=99){
var random=Math.floor((Math.random()*999)+0);
if(tempArray.indexOf(random)=-1){
tempArray.push(随机);
i++;
}否则{
继续;
}
}
log(tempArray)代码>下面的代码只是一个示例,它将生成99个数字,所有数字都是唯一和随机的(范围为0-1000),逻辑很简单,只需在临时数组中添加随机数,并比较是否已生成新的随机数
var tempArray=[];
var i=0;
而(i!=99){
var random=Math.floor((Math.random()*999)+0);
if(tempArray.indexOf(random)=-1){
tempArray.push(随机);
i++;
}否则{
继续;
}
}
log(tempArray)代码>如果您希望始终从数组中返回不同的数字,则不要随机化,而是洗牌*
最简单的公平(真正随机)洗牌算法是Fisher-Yates算法。不要做同样的事。只要实施:
您希望如何处理图像用尽的问题取决于您。iTunes或iPhone、iPad和iPod上的音乐播放器等媒体播放器为用户提供了停止播放或从头开始重复播放的选项。一些纸牌游戏软件将重新洗牌并重新启动
*注意:我最讨厌的是随机化而不是随机播放的音乐播放器软件。随机化完全是错误的,因为1。有些实现不检查下一首歌曲是否与当前歌曲相同,因此您可以播放一首歌曲两次(您似乎希望避免播放)和两次。有些歌曲最终无法播放。洗牌和从头到尾播放洗牌播放列表可以避免这两个问题。CD播放器制造商做对了。MP3播放器开发人员往往会弄错
如果你想总是从一个数组中返回一个不同的数字,那么不要随机化,而是洗牌*
最简单的公平(真正随机)洗牌算法是Fisher-Yates算法。不要做同样的事。只要实施:
您希望如何处理图像用尽的问题取决于您。iTunes或iPhone、iPad和iPod上的音乐播放器等媒体播放器为用户提供了停止播放或从头开始重复播放的选项。一些纸牌游戏软件将重新洗牌并重新启动
*注意:我最讨厌的是随机化而不是随机播放的音乐播放器软件。随机化完全是错误的,因为1。有些实现不检查下一首歌曲是否与当前歌曲相同,因此您可以播放一首歌曲两次(您似乎希望避免播放)和两次。有些歌曲最终无法播放。洗牌和从头到尾播放洗牌播放列表可以避免这两个问题。CD播放器制造商做对了。MP3播放器开发人员往往会弄错
这是一个确保随机数始终不同于上一个的版本。此外,还可以控制生成的随机值的最大值和最小值。默认值为最大值:100和最小值:1
var randomize = (function () {
var last;
return function randomize(min, max) {
max = typeof max != 'number' ? 100 : max;
min = typeof min != 'number' ? 1 : min;
var random = Math.floor(Math.random() * (max - min)) + min;
if (random == last) {
return randomize(min, max);
}
last = random;
return random;
};
})();
这是一个确保随机数始终不同于上一个的版本。此外,还可以控制生成的随机值的最大值和最小值。默认值为最大值:100和最小值:1
var randomize = (function () {
var last;
return function randomize(min, max) {
max = typeof max != 'number' ? 100 : max;
min = typeof min != 'number' ? 1 : min;
var random = Math.floor(Math.random() * (max - min)) + min;
if (random == last) {
return randomize(min, max);
}
last = random;
return random;
};
})();
如果它总是不同于
var randomize = (function () {
var last;
return function randomize(min, max) {
max = typeof max != 'number' ? 100 : max;
min = typeof min != 'number' ? 1 : min;
var random = Math.floor(Math.random() * (max - min)) + min;
if (random == last) {
return randomize(min, max);
}
last = random;
return random;
};
})();