2011-02-09 2 views

Répondre

5

Voici ma tentative en utilisant splice:

var a = [1,2,3,4,5,6,7,8,9,10];var sample = []; 
sample.push(a.splice(Math.random()*a.length,1)); 
sample.push(a.splice(Math.random()*a.length,1)); 

Enveloppé dans une fonction:

function sample_range(range, n) { 
    var sample = []; 
    for(var i=0; i<n; i++) { 
    sample.push(range.splice(Math.random()*range.length,1)); 
    } 

    return sample; 
} 

var sample = sample_range([1,2,3,4,5,6,7,8,9,10], 2); 

On peut aussi coller la fonction dans Array.prototype avoir quelque chose comme la syntaxe de la notation par points:

Array.prototype.sample_range = function(n) { 
    var sample = []; 
    for(var i=0;i<n;i++) { 
     sample.push(this.splice(Math.random()*this.length,1)); 
    } 
    return sample; 
}; 
var sample = [1,2,3,4,5,6,7,8,9,10].sample_range(2); 
+0

Performances sur cette plage O (n *). Je ne suggérerais pas de l'utiliser. Vous feriez mieux d'exécuter n itérations de Knuth shuffle qui serait O (n) si vous supposez que le tableau range a déjà été créé, O (n + range) sinon. – Brian

0

Générer un, puis générer à plusieurs reprises la seconde jusqu'à ce qu'il soit pas la même chose que le premier. Il y a peu de chance que cela se produise plus longtemps, mais vous ne verrez aucun impact sur les performances à moins de devoir générer des milliards de chiffres.

4

Si vous souhaitez générer des nombres aléatoires entre 0 et n, une façon est de choisir au hasard le numéro r1 dans 0..n puis choisissez r2 de 0..n-1 et ajouter 1 à r2 si r2 >= r1.

1
function sample(range,tot){ 
    if(tot > range){ 
     alert('infinite loop?'); 
     return []; 
    } 
    var myRandomNumbers = []; 
    for(var i = 0; i<tot; i++){ 
     var randN = Math.floor(Math.random()*range); 
     while(myRandomNumbers.contains(randN)){ 
      randN = Math.floor(Math.random()*range); 
     } 
     myRandomNumbers.push(randN); 
    } 
    return myRandomNumbers 
} 

var nums = sample(10,2); //array containing 2 distinct random numbers 
Questions connexes