Javascript Math random可在不复制的情况下在数组中查找名称

Javascript Math random可在不复制的情况下在数组中查找名称,javascript,arrays,math,random,Javascript,Arrays,Math,Random,所以我想从一个名称数组中找出三个名称,然后我想把它们写到一个新的数组中,虽然还没有到现在为止,但是我的问题是,它一直在随机化我已经找到的相同的名称 看看这本书 代码: findStudentBtn.onclick = findStudent; function findStudent() { var studArray = ["John","Daniel","Hans","Lars","Tom","Amanda","Jane","Sarah"] //1-8 for (i=0;

所以我想从一个名称数组中找出三个名称,然后我想把它们写到一个新的数组中,虽然还没有到现在为止,但是我的问题是,它一直在随机化我已经找到的相同的名称

看看这本书

代码:

findStudentBtn.onclick = findStudent;

function findStudent() {
    var studArray = ["John","Daniel","Hans","Lars","Tom","Amanda","Jane","Sarah"] //1-8
    for (i=0; i<3; i++) {
        if (i=1) {
            var randomStud1 = studArray[Math.floor(studArray.length * Math.random())];
            msg8.innerHTML += randomStud1 + ", ";
        }
        if (i=2) {
            var randomStud2 = studArray[Math.floor(studArray.length * Math.random())];
            msg8.innerHTML += randomStud2 + ", ";
        }
        if (i=3) {
            var randomStud3 = studArray[Math.floor(studArray.length * Math.random())];
            msg8.innerHTML += randomStud3 + ", ";
        }

        if (randomStud1 == randomStud2 || randomStud2 == randomStud3 || randomStud1 == randomStud3){
            ms8.innerHTML = "";
            findStudent();
        } 
    }
}  

对于任何对解决方案感兴趣但不愿意使用jsfidle的人,下面是我使用的脚本

findStudentBtn.onclick = function(){
    findStudent();
};

var r_stud = ["John","Daniel","Hans","Lars","Tom","Amanda","Jane","Sarah"];
var r_rndm = [];
var r_newr = [];

function getStudent(){

    //if the amount of available people, is to small to reach 3.
    if(r_rndm.length == r_stud.length){
        //reset the random selected array
        r_rndm = [];
        return r_newr;
    }

    //select a student
    var i_randomStudent = Math.floor(r_stud.length * Math.random());
    var s_randomStudent = r_stud[i_randomStudent];

    if(r_rndm.indexOf(s_randomStudent) >= 0){
        //if it's allready been selected, try again.
        getStudent();
    }else{
        //add students to new selection and to alltime selection
        r_rndm.push(s_randomStudent);
        r_newr.push(s_randomStudent);

        //return the new array
        return r_newr;
    }

};

function findStudent(){

    //reset new array.
    r_newr = [];
    for(i = 0; i < 3; i++){
        getStudent();
    };

    //print contents of new array to console.
    console.log(r_newr);

    for(i = 0; i < r_newr.length; i++){
        separator = (i == r_newr.length - 1 && r_rndm.length == 0 ) ? '' : ', ';
        msg8.innerHTML += r_newr[i] + separator;
    }

};

谷歌如何在Javascript中设置随机数生成器种子-我不记得了,但如果每次运行都得到相同的序列,那就是问题所在。一种不重复随机选择的流行方法是随机洗牌数组,然后取前N个元素。如果I=1{与其说是一个条件,不如说是一个赋值。如果i==1,您希望{一种可能是始终跟踪您已经选择的索引,然后获得另一个随机数,如果它与您已经选择的任何索引相同。它不是很优雅,但很有效。我已经更新了jsfidle,这给了您想要的效果。非常感谢您的回答。这基本上是我想要的,但我有一个问题:r_rndm.indexOfs_randomstudio>=0行到底做了什么?为什么大于或等于0?indexOf给出了要检查的变量的第一个实例的索引,在本例中,我们在数组r_rndm中查找新名称s_randomstudior的第一个索引。如果它在数组中,它将返回0或其他值g Biger,如果不是,它将返回-1。非常感谢!你帮了我很大的忙