Autor Zpráva
benett
Profil
Omlouvám se za hloupý dotaz, ale nějak nemůžu přijít na to,
proč mi tento kód vygeneruje občas i 2 stejné hodnoty, i když by měly být všechny různé.

var p=new Array();
var poc=10;
p[0]=1234;
for (var i=1;i<poc;i++){
do {p[i]=Math.round(Math.random()*(poc+1));}
while (p[i]==p[i-1])
}
fajzen
Profil
asi to bude tým, že kontroluješ len zhodu medzi posledným a predposledným prvkom, takže keď máš 3 prvky, tak prvý je napr. 1, druhý sa bude generovať tak dlho, aby to nebolo 1, napr. 2 a tretí sa bude generovať tak dlho, aby to nebolo 2, ale 1 to môže byť atď.
benett
Profil
právě jsem si to taky uvědomil, díky :)
los
Profil *
Otázka síce bola zodpovedaná, ale ešte by som sa chcel spýtať, čo vlastne chceš dosiahnuť? Podľa kódu to vyzerá tak, že chceš vytvoriť pole, ktoré obsahuje všetky hodnoty od 0 do poc=10.

V tom prípade bude lepšie náhodne zamiešať pole so všetkými prvkami, než postupne vyberať náhodné prvky:
var poc = 10;
var p = []
for (var i = 0; i < poc; ++i)
  p[i] = i;
for (var i = poc; i > 1;) {
  var j = Math.random() * i-- | 0;
  var t = p[i];
  p[i] = p[j];
  p[j] = t;
}

Dá sa to zapísať aj kratšie, ale kvôli prehľadnosti som to nechal takto. Písal som to priamo sem, takže je možné, že tam sú nejaké chyby, ale princíp je zrejmý.
Chamurappi
Profil
Reaguji na losa:
Mně se líbí míchání pole sortem:
var poc = 10;
var p = []
for (var i = 0; i < poc; ++i)
  p[i] = i;
p = p.sort(function()
{
  return Math.random() - 0.5;
});
los
Profil *
Chamurappi
Áno, sort vyzerá lepšie. Vďaka za upravenie formátovania.
_es
Profil
Chamurappi
Toto zoradenie asi nezaručí celkom náhodné zoradenie.
Algoritmus na zoradenie asi predpokladá, že pre rovnaké prvky vráti funkcia vždy to isté.
Rôzne prehliadače, pri rovnakom poli a funkcii, ktorá tej podmienke vyhovuje, volajú tú funkciu rôzny počet krát, podľa toho, aký algoritmus je v tom prehliadači implementovaný na zoradenie - skúšal som to.
Takže ten tvoj kód asi nezaručí úplne matematicky náhodné zoradenie, aj keď celkom istý si tým nie som.
Chamurappi
Profil
Reaguji na _es:
Něco na tom bude. Našel jsem teď na toto téma poučnou diskusi na stackoverflow.com.
_es
Profil
Chamurappi
Ja som o tom nič nehľadal, no podvedome sa mi na tom tvojom kóde hneď niečo nepáčilo.
_es
Profil
Toto by malo byť náhodné práve tak ako funkcia Math.random:
var poc = 10, p = [], x = [];
for(var i = 0; i < poc; ++i) p[i] = i;
for(i = 0; i < poc; ++i) x[i] = p.splice(Math.floor(Math.random() * (poc - i)), 1)[0];
p = x;

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0