2012-05-22 31 views
9

Sto utilizzando la funzione JavaScript Math.random() per distribuire gli articoli oltre i bucket. Successivamente, visualizzo i secchi in una tela. Mi aspetto che gli elementi siano distribuiti in modo uniforme, ma (anche dopo ripetuti tentativi in ​​più browser), sembra che la distribuzione sia molto più fine sulla sinistra (vicino a zero) e diventi più uniforme verso destra (più vicino a 1). Vedere l'immagine enter image description here.Comportamento casuale strano JavaScript

Sto sbagliando oppure la funzione casuale di JavaScript non funziona? Di seguito è riportato il codice che è stato utilizzato per generare questa immagine:

<html> 
    <head> 
     <script> 
      window.onload = function() { 
        var canvas = document.getElementById('canvas'); 
        var ctx = canvas.getContext('2d'); 
        var width = canvas.width; 
        var height = canvas.height;  
        var buckets = width; 
        var total = width*height*0.3; 
        var bucketList = []; 
        // initialized each bucket to 0 items 
        for(var i=0; i<buckets; ++i) { 
          bucketList[i] = 0; 
        } 
        // distribute all items over the buckets 
        for(var i=0; i<total; ++i) { 
         ++bucketList[Math.floor(Math.random()*buckets)]; 
        } 
        // draw the buckets 
        ctx.fillStyle = "rgb(200,0,0)"; 
        for(var i=0; i<buckets; ++i) { 
         ctx.fillRect (i, height-bucketList[i], i+1, height); 
        } 
      } 
      </script> 
    </head> 
    <body> 
      <canvas id="canvas" width="1000px" height="500px"/> 
    </body> 
</html> 
+3

'ctx.fillRect (i, altezza-bucketList [i], i + 1, altezza);' dovrebbe essere 'ctx.fillRect (i, height-bucketList [i], 1, height);' – xiaoyi

+1

+1 per aver fatto questa domanda perfettamente. È chiaramente formulato, il codice è completo, facile da seguire e pulito, e l'immagine mostra esattamente cosa sta succedendo. La domanda in sé è interessante e pertinente. Grazie! –

+0

@AdamLiss ha tracciato i numeri in modo errato ... – xiaoyi

risposta

3

Permettetemi di rispondere con una risposta, dal momento che il mio commento sulla questione ha una grande possibilità di essere perduta tra i suoi vicini.

Quindi, con la correzione suggerita da @xiaoyi sul posto, l'immagine mi sembra abbastanza casuale: http://jsfiddle.net/TvNJw. La procedura di tracciatura originariamente suggerita nella domanda aumenta in modo errato la larghezza del secchio verniciato al crescere di i, mentre tutti i bucket dovrebbero avere la larghezza di 1. Questo può essere facilmente rappresentato tracciando secchi con colori diversi.