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一个包含所有可能值的数组,并且:
- select一个随机数<=数组的大小
- 从数组中删除所选的元素
- 重复步骤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);
这个代码在得到所有七个数字之后会被卡住,所以你需要确定它存在于所有的七个数字之后。