似乎无法找到答案,说我有这个:
setInterval(function() {
m = Math.floor(Math.random()*7);
$('.foo:nth-of-type('+m+')').fadeIn(300);
}, 300);
如何使随机数不重复。例如,如果随机数为2,我不希望2再次出现。
答案 0 :(得分:10)
您可以通过多种方式实现这一目标。
解决方案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);
答案 1 :(得分:3)
你似乎想要一个从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。每次抽出一次后,它将重新开始。
答案 2 :(得分:1)
我喜欢Neal的答案,尽管这是在乞求一些递归。这是在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());
}
}
}
答案 3 :(得分:0)
你可以试试吗,
setInterval(function() {
m = Math.floor(Math.random()*7);
$('.foo:nth-of-type(' + m + ')').fadeIn(300);
}, 300);
答案 4 :(得分:0)
通常我的方法是创建一个包含所有可能值的数组,并且:
结果数字集将包含所有索引而不重复。
更好,也许是这样的:
var numArray = [0,1,2,3,4,5,6];
numArray.shuffle();
然后只需浏览这些项目,因为随机播放会将它们随机化并逐个弹出。
答案 5 :(得分:0)
不确定是否为时已晚,但仍想添加 -
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];
}
}
这基本上使用时间戳(每毫秒)来始终生成唯一的数字。
答案 6 :(得分:0)
这是一个简单的解决方案,如果有点简陋:
if(nextNum == lastNum){
if (nextNum == 0){nextNum = 7;}
else {nextNum = nextNum-1;}
}
如果下一个数字与最后一个数字相同,则除非数字为0(零),并将其设置为您的集合中的任何其他数字(我选择7,最高指数)。
我在循环函数中使用了这个方法,因为选择数字的唯一规定是与最后一个不一样。
不是最优雅或技术上有天赋的解决方案,但它有效:)
答案 7 :(得分:0)
使用集。它们是ES6中引入的规范。集合是代表唯一值集合的数据结构,因此它不能包含任何重复值。我需要6个随机的,不可重复的数字,范围是1-49。我首先创建了一个长约30位的集合(如果值重复,则该集合将包含较少的元素),将集合转换为数组,然后将其切成前6个元素。十分简单。 Set.length 默认是未定义,这是无用的,这就是为什么如果需要特定长度,将其转换为数组更容易的原因。
let randomSet = new Set();
for (let index = 0; index < 30; index++) {
randomSet.add(Math.floor(Math.random() * 49) + 1)
};
let randomSetToArray = Array.from(randomSet).slice(0,6);
console.log(randomSet);
console.log(randomSetToArray);
答案 8 :(得分:0)
一种简单的方法来生成不同数字的列表,无论大小或数字如何:
function randomNumber(max) {
return Math.floor(Math.random() * max + 1);
}
const list = []
while(list.length < 10 ){
let nbr = randomNumber(500)
if(!list.find(el => el === nbr)) list.push(nbr)
}
console.log("list",list)
答案 9 :(得分:-1)
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);
此代码在获取所有七个数字后将会卡住,因此您需要确保它在完成所有数字后才存在。