Javascript 创建一个函数,该函数返回唯一的随机数,并将该数指定给单个变量

Javascript 创建一个函数,该函数返回唯一的随机数,并将该数指定给单个变量,javascript,function,variables,random,Javascript,Function,Variables,Random,我刚开始编程,就遇到了这个问题。论坛上发布的答案并没有真正帮助我,所以我的问题来了。 我试图创建一个函数,它可以生成4个介于1-12之间的随机数。生成数字后,将其分配给单个变量 var gem1; var gem2; var gem3; var gem4; function updateGem() { gem1 = Math.floor(Math.random() * 12 + 1); gem2 = Math.floor(Math.random() * 12 + 1);

我刚开始编程,就遇到了这个问题。论坛上发布的答案并没有真正帮助我,所以我的问题来了。 我试图创建一个函数,它可以生成4个介于1-12之间的随机数。生成数字后,将其分配给单个变量

var gem1;
var gem2;
var gem3;
var gem4;

function updateGem() {
    gem1 = Math.floor(Math.random() * 12 + 1);
    gem2 = Math.floor(Math.random() * 12 + 1);
    gem3 = Math.floor(Math.random() * 12 + 1);
    gem4 = Math.floor(Math.random() * 12 + 1);
}

正如您所看到的,有时生成的数字是匹配的,这不是我需要的。我需要每个变量都有自己的唯一编号

The value of gem 1 is 8
The value of gem 2 is 9
The value of gem 3 is 9
The value of gem 4 is 8

将变量存储在数组中,并检查数组中的数字

var-gem1;
gem2变种;
var-gem3;
gem4变种;
var-arr=[];
函数updateGem(){
arr=[];
gem1=数学地板(数学随机()*12+1);
如果(包括(gem1))
updateGem();
其他的
arr.push(gem1);
gem2=数学地板(数学随机()*12+1);
如果(包括(gem2))
updateGem();
其他的
arr.push(gem2);
gem3=数学地板(数学随机()*12+1);
如果(包括(gem3))
updateGem();
其他的
arr.push(gem3);
gem4=数学地板(数学随机()*12+1);
如果(包括(gem4))
updateGem();
其他的
arr.push(gem4);
}
updateGem()
控制台日志(gem1)
控制台日志(gem2)
控制台日志(gem3)

log(gem4)
将变量存储在数组中,并检查数组中的数字

var-gem1;
gem2变种;
var-gem3;
gem4变种;
var-arr=[];
函数updateGem(){
arr=[];
gem1=数学地板(数学随机()*12+1);
如果(包括(gem1))
updateGem();
其他的
arr.push(gem1);
gem2=数学地板(数学随机()*12+1);
如果(包括(gem2))
updateGem();
其他的
arr.push(gem2);
gem3=数学地板(数学随机()*12+1);
如果(包括(gem3))
updateGem();
其他的
arr.push(gem3);
gem4=数学地板(数学随机()*12+1);
如果(包括(gem4))
updateGem();
其他的
arr.push(gem4);
}
updateGem()
控制台日志(gem1)
控制台日志(gem2)
控制台日志(gem3)

console.log(gem4)
您可以执行以下操作:

函数生成器域唯一(大小){
const unique=新集合();
while(唯一大小<大小){
添加(Math.floor(Math.random()*12+1));
}
返回[…唯一];
}
const[gem1,gem2,gem3,gem4]=generateRandomUnique(4);

控制台日志(gem1、gem2、gem3、gem4)您可以这样做:

函数生成器域唯一(大小){
const unique=新集合();
while(唯一大小<大小){
添加(Math.floor(Math.random()*12+1));
}
返回[…唯一];
}
const[gem1,gem2,gem3,gem4]=generateRandomUnique(4);

控制台日志(gem1、gem2、gem3、gem4)这就是我为解决问题所做的:

function updateGem() {
    var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
    numbers.sort(() => {
        return 0.5 - Math.random();
    });

    gem1 = numbers[0];
    gem2 = numbers[1];
    gem3 = numbers[2];
    gem4 = numbers[3];

}

这就是我为解决问题所做的:

function updateGem() {
    var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
    numbers.sort(() => {
        return 0.5 - Math.random();
    });

    gem1 = numbers[0];
    gem2 = numbers[1];
    gem3 = numbers[2];
    gem4 = numbers[3];

}

根据数组长度生成一个随机数。与上一个索引交换,现在再次基于减少1的数组长度生成一个数字

var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
var count = numbers.length;
function updateGem() {

    gem1 = getRandomNumber();
    gem2 = getRandomNumber();
    gem3 = getRandomNumber();
    gem4 = getRandomNumber();

    console.log(gem1, gem2, gem3, gem4);

}
function getRandomNumber() {

    if (count <= 0) {
        count = numbers.length;
    }
    var randomIndex = Math.round(count * Math.random());
    console.log("Random Number="+randomIndex);
    var temp = numbers[randomIndex]; 
    numbers[randomIndex] = numbers[count-1];
    numbers[count-1] = temp;
    count--; // next time do not generate this random number
    return temp;
}
var数字=[1,2,3,4,5,6,7,8,9,10,11,12];
var count=number.length;
函数updateGem(){
gem1=getRandomNumber();
gem2=getRandomNumber();
gem3=getRandomNumber();
gem4=getRandomNumber();
控制台日志(gem1、gem2、gem3、gem4);
}
函数getRandomNumber(){

if(count根据数组长度生成一个随机数。与上一个索引交换,现在再次根据减少1的数组长度生成一个数字

var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
var count = numbers.length;
function updateGem() {

    gem1 = getRandomNumber();
    gem2 = getRandomNumber();
    gem3 = getRandomNumber();
    gem4 = getRandomNumber();

    console.log(gem1, gem2, gem3, gem4);

}
function getRandomNumber() {

    if (count <= 0) {
        count = numbers.length;
    }
    var randomIndex = Math.round(count * Math.random());
    console.log("Random Number="+randomIndex);
    var temp = numbers[randomIndex]; 
    numbers[randomIndex] = numbers[count-1];
    numbers[count-1] = temp;
    count--; // next time do not generate this random number
    return temp;
}
var数字=[1,2,3,4,5,6,7,8,9,10,11,12];
var count=number.length;
函数updateGem(){
gem1=getRandomNumber();
gem2=getRandomNumber();
gem3=getRandomNumber();
gem4=getRandomNumber();
控制台日志(gem1、gem2、gem3、gem4);
}
函数getRandomNumber(){

如果(计数这是随机的点。可以尝试更高的边界以减少冲突的机会,或者存储数字并与以前生成的数字进行比较,或者生成一个数字并在下一个3中递增。您可以创建一个数字为1到12的数组。然后洗牌此数组,并获取前四个元素。这样,您可以获得一个0的数组f 4介于1到12之间的唯一随机数Thank@NickParsons的可能重复完成了此任务!这就是随机点的随机性。可以尝试更高的边界以减少冲突的机会,或者存储数字并与以前生成的数字进行比较,或者生成一个数字并在下一个3中递增。您可以使用该数字创建一个数组从s1到12。然后洗牌这个数组,抓取前四个元素。这样,你可以得到一个由4个唯一的随机数组成的数组,范围在1到12之间。多谢@NickParsons成功了!这需要多少次迭代?即使随机选择3个数作为第4个数,它也必须再次生成3。我想它没有效率我很清楚。n-无限迭代如果你的机器心情不好,那么它将永远需要多少次迭代?即使随机选择3个数字作为第4个数字,它也必须再次生成3。我认为它没有效率我很清楚。n-无限迭代如果你的机器心情不好,那么它就完蛋了永远记住这种洗牌方法不是真正随机的:记住这种洗牌方法不是真正随机的: