math随机数而不重复以前的数字

似乎无法find答案,说我有这个:

setInterval(function() { m = Math.floor(Math.random()*7); $('.foo:nth-of-type('+m+')').fadeIn(300); }, 300); 

我怎样才能让随机数字不会重复。 例如,如果随机数是2,我不想要2再出来。

有很多方法可以实现这一点。

答案A:如果数字的范围不是很大(比方说小于10),那么您可以跟踪已经生成的数字。 那么如果你生成一个副本,丢弃它并生成另一个数字。

解决schemeB:预先生成随机数,将它们存储到一个数组中,然后通过数组。 你可以通过把数字1,2,...,n ,然后洗牌来完成。 请参阅http://snippets.dzone.com/posts/show/849

 var randorder = shuffle([0,1,2,3,4,5,6]); var index = 0; setInterval(function() { $('.foo:nth-of-type('+(randorder[index++])+')').fadeIn(300); }, 300); 

解决schemeC:跟踪数组中可用的数字。 随机挑选一个数字。 从数组中删除数字。

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

通常我的方法是创build一个包含所有可能值的数组,并且:

  1. select一个随机数<=数组的大小
  2. 从数组中删除所选的元素
  3. 重复步骤1-2,直到数组为空

所得到的一组数字将包含所有的索引而不重复。

更好,也许是这样的:

 var numArray = [0,1,2,3,4,5,6]; numArray.shuffle(); 

然后只是通过项目,因为洗牌会随机化他们,并一次从一个popup。

我喜欢尼尔的答案,虽然这是乞求一些recursion。 这里是在Java中,你仍然会得到一般的想法。 请注意,如果您拉出的数字超过MAX,您将会遇到无限循环,但我可以修复该数字,但为了清晰起见,请将其保留。

编辑:锯neal添加了一个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 RecordKeeper = {}; SRandom = function () { currTimeStamp = new Date().getTime(); if (RecordKeeper.hasOwnProperty(currTimeStamp)) { RecordKeeper[currTimeStamp] = RecordKeeper[currTimeStamp] + 1; return currTimeStamp.toString() + RecordKeeper[currTimeStamp]; } else { RecordKeeper[currTimeStamp] = 1; return currTimeStamp.toString() + RecordKeeper[currTimeStamp]; } } 

这基本上使用时间戳(每毫秒)总是生成一个唯一的数字。

这是一个简单的解决方法,如果有点简单:

 if(nextNum == lastNum){ if (nextNum == 0){nextNum = 7;} else {nextNum = nextNum-1;} } 

如果下一个数字与最后一个简单的减1相同,除非数字是0(零),并将其设置为您的集合中的任何其他数字(我select了7,最高的索引)。

我在循环函数中使用了这个方法,因为只有select一个数字的规定是不可能和最后一个一样的。

不是最优雅或技术天赋的解决scheme,但它的工作:)

你可以这样做。 有一个你已经使用的公钥数组,并用这个函数检查它们:

 function in_array(needle, haystack) { for(var key in haystack) { if(needle === haystack[key]) { return true; } } return false; } 

(函数来自: javascript function inArray )

所以你可以做的是:

 var done = []; setInterval(function() { var m = null; while(m == null || in_array(m, done)){ m = Math.floor(Math.random()*7); } done.push(m); $('.foo:nth-of-type('+m+')').fadeIn(300); }, 300); 

这个代码在得到所有七个数字之后会被卡住,所以你需要确定它存在于所有的七个数字之后。