2017-05-04 4 views
2

generieren Ich bin, versuchen eine Reihe von sechs zu schaffen, und es muss ihr von 1 bis 60.ein Array ohne Wiederholungen in Winkel 2

Mein Code jetzt keine sich wiederholenden Zahlen nicht haben wie folgt aus:

jogar(){   
    if(this.random.length != 0){ 
     this.random=[]; 
     }else{ 
      for(var u=0; u<6; u++){ 
      this.y = Math.ceil(Math.random()*59+1); 
       for (var r of this.random){ 
        if(r != this.y){ 
         this.random.push(this.y); 
        }; 
       };                
      }; 
      this.random.sort(function(a, b){return a-b}); 
      return this.random; 
     };         
}; 

Es sollte überprüfen, ob das Array mehr als 0 Elemente hat, wenn es es tut, wird es es leeren. wenn es leer ist wird es das Array ... montieren Und es sollte Zahlen nicht wiederholen ... Dies funktioniert bis zu dem Punkt, dass ich die Wiederholung Checker einsetzen ..:

   for(var r of this.random) 
       if(r != this.y){ 
        this.random.push(this.y); 
       }; 

Dieser Kerl macht meine Code funktioniert nicht mehr.

Nach der Suche habe ich etwas über die Fisher-Yates Shuffle Technik gelesen, aber es scheint nicht für mich zu funktionieren.

Ich benutze Winkel 2, mit dem Ionic 2-Framework.

Hat sich hier schon jemand was einfallen lassen?

+0

Wo können Sie das lösen? – sebaferreras

+0

Ja, aber nicht mit Ihrer Methode, werde ich meine Antwort posten. – GustavoA

Antwort

1

Dies ist, was mein Code jetzt aussieht. Arbeiten!

jogar(){  
    this.final = []; 
    this.numeros = []; 
    for(var i=0;this.final.length<6;i++){ 
     this.final = this.numberSelect.map(Number).concat(this.numeros);   
     var novoNumero=Math.floor((Math.random()*59)+1);    
     var verificacao=this.confereSeArrayContemItem(this.final,novoNumero);  
     if(verificacao!==1){ 
      this.numeros.push(novoNumero);     
     }else{ 
      i--; 
     } 
     this.final.sort(function(a,b){return a-b});  
    } 
    console.log(this.final.sort(function(a,b){return a-b})); 
} 

confereSeArrayContemItem(array, item){ 
    var resultado = 0; 
    for(var i=0;i<array.length;i++){ 
     if(array[i]===item){ 
      resultado =1; 
     } 
    } 
    return resultado; 
} 
1

Dieser Satz ist falsch, weil

for(var r of this.random) 
    if(r != this.y){ 
    this.random.push(this.y); 
}; 

versuchen, die this.y Zahl der zufälligen Anordnung, jedes Mal, dass eine Reihe von zufälligen Anordnung drücken unterscheidet sich von der this.y Zahl ist.

Wie Sie in diesem working plunker sehen können, können Sie erreichen, was Sie für mit dem folgenden Code suchen:

import { Component } from '@angular/core'; 

@Component({...}) 
export class HomePage { 

    random: Array<number> = []; 


    public jogar(): Array<number> {   
    if(this.random.length != 0) { 
     this.random=[]; 
    } 

    while (this.random.length < 6) { // <- Use while instead of for 
     let randomNumber = this.getRandomNumber(); // Get a random number 
     if(!this.wasAlreadyAdded(randomNumber)) { 
     this.random.push(randomNumber); // Add it if it doesn't exist in the array 
     } 
    } 

    this.random.sort(function(a, b){return a-b}); 
    return this.random; 

    } 

    private getRandomNumber(): number { 
    return Math.ceil(Math.random()*59+1); 
    } 

    private wasAlreadyAdded(randomNumber: number): number { 
    return this.random.indexOf(randomNumber) !== -1; 
    } 

}