似乎无法找到答案,说我有这个:
setInterval(function() {
m = Math.floor(Math.random()*7);
$('.foo:nth-of-type('+m+')').fadeIn(300);
}, 300);
我如何做到这一点,以便随机数不会重复。比如随机数是2,我就不想2再出来了。
似乎无法找到答案,说我有这个:
setInterval(function() {
m = Math.floor(Math.random()*7);
$('.foo:nth-of-type('+m+')').fadeIn(300);
}, 300);
我如何做到这一点,以便随机数不会重复。比如随机数是2,我就不想2再出来了。
有多种方法可以实现这一点。
解决方案 A:如果数字的范围不大(比方说小于 10),您可以跟踪您已经生成的数字。然后,如果您生成重复项,则丢弃它并生成另一个数字。
方案B:预先生成随机数,存入数组,然后遍历数组。你可以通过取数字1,2,...,n
然后洗牌来实现这一点。
shuffle = function(o) {
for(var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
return o;
};
var randorder = shuffle([0,1,2,3,4,5,6]);
var index = 0;
setInterval(function() {
$('.foo:nth-of-type('+(randorder[index++])+')').fadeIn(300);
}, 300);
解决方案 C:跟踪数组中可用的数字。随机选择一个数字。从所述数组中删除数字。
var randnums = [0,1,2,3,4,5,6];
setInterval(function() {
var m = Math.floor(Math.random()*randnums.length);
$('.foo:nth-of-type('+(randnums[m])+')').fadeIn(300);
randnums = randnums.splice(m,1);
}, 300);
您似乎想要一个从 0 到 6 的非重复随机数,因此类似于 tskuzzy 的回答:
var getRand = (function() {
var nums = [0,1,2,3,4,5,6];
var current = [];
function rand(n) {
return (Math.random() * n)|0;
}
return function() {
if (!current.length) current = nums.slice();
return current.splice(rand(current.length), 1);
}
}());
它将以随机顺序返回数字 0 到 6。当每个都被绘制一次后,它将重新开始。
你可以试试吗
setInterval(function() {
m = Math.floor(Math.random()*7);
$('.foo:nth-of-type(' + m + ')').fadeIn(300);
}, 300);
我喜欢尼尔的回答,尽管这是在乞求一些递归。这是在java中,你仍然会得到一般的想法。请注意,如果您拉出的数字多于 MAX,您将遇到无限循环,我可以解决这个问题,但为了清楚起见,将其保留原样。
编辑:看到尼尔添加了一个while循环,所以效果很好。
public class RandCheck {
private List<Integer> numbers;
private Random rand;
private int MAX = 100;
public RandCheck(){
numbers = new ArrayList<Integer>();
rand = new Random();
}
public int getRandomNum(){
return getRandomNumRecursive(getRand());
}
private int getRandomNumRecursive(int num){
if(numbers.contains(num)){
return getRandomNumRecursive(getRand());
} else {
return num;
}
}
private int getRand(){
return rand.nextInt(MAX);
}
public static void main(String[] args){
RandCheck randCheck = new RandCheck();
for(int i = 0; i < 100; i++){
System.out.println(randCheck.getRandomNum());
}
}
}
通常,我的方法是制作一个包含所有可能值的数组,然后:
生成的一组数字将包含您的所有索引而不会重复。
更好的是,也许是这样的:
var numArray = [0,1,2,3,4,5,6];
numArray.shuffle();
然后只需浏览这些项目,因为 shuffle 会将它们随机化并一次弹出一个。