Autor Zpráva
Jirsak
Profil
Chtel bych poprosit o radu. Chtel bych vygenerovat nahodna cisla do pole. Cisla se ale nesmi opakovat. Nahodne generovani do pole uz mam. Overovani, zda se cisla opakuji taktez (mozna by mi nekdo mohl poradit s elegantnejsim resenim), ale ted nevim, jak rozume opravit opakujici se cisla.

K jakemu kodu jsem zatim dosel:

function opakovani () {
for (var j:Number = 0; j<10; j++) {
pokus[j] = randRange(1, 35);
pokus.sort(Array.NUMERIC); // serad cisla vzestupne
}
}

function randRange(min:Number, max:Number):Number {
var randomNum:Number = Math.round(Math.random()*(max-min))+min;
return randomNum;
}

// vytvoreni pole
var pokus:Array = new Array();
// vytvoreni pole
opakovani ();

/* Protoze jsou cisla serazeny vzestupne, mohu kontrolovat, zda sousedici cisla nejsou stejna */
// overeni sousedicich cisel
for (var j:Number = 0; j<10; j++) {
if (pokus[j] == pokus[j-1]) {
poznamka = "V poli se opakují čísla. Nejvyšší opakující se je: " + pokus[j];
//pokus[j] = "zamenim za: " + randRange(1, 35);
}
}
// overeni sousedicich cisel


Na scene pouzivam 2 dynamicka pole, ktera Var maji nastaveno na:
pokus
poznamka

Dekuji za vypomoc,
Jakub Jirsak
DoubleThink
Profil *
No jelikož metody objektu Array jsou ve Flashi dost omezené, tak asi jiný lepší způsob nebude.

Jasné mi ale není jedno - proč zjišťovat se kterými čísly hodnota sousedí a pak to porovnávat.
Jednodušší je projet smyčkou celé pole a případně vygenerovat nové číslo.
Hanz
Profil
Jirsak
Takto:
var pole:Array = new Array();

for (i=0; i<10; i++) {
cislo = Math.round(Math.random()*(35-1))+1;
for (a=0; a<9; a++) {
if (cislo == pole[a]) {
cislo = "";
}
}
if (cislo != "") {
pole[i] = cislo;
}
}
pole.sort(Array.NUMERIC);


Jen si tam doplň co potřebuješ.
Jirsak
Profil
Sousedici hodnoty porovnam, abych zjistil, jestli nektere hodnoty nejsou stejne. Chtel jsem vytvorit cyklus pres while, ale nejak to nefungovalo. Nevim, kde jsem delal chybu. respektive, nevim asi presne, jak smyckou projit cele pole a zjistovat, jetsli nektere hodnoty v nem nejsou stejne.

Predstavoval jsem si to nejak takto:

function randRange(min:Number, max:Number):Number {
var randomNum:Number = Math.round(Math.random()*(max-min))+min;
return randomNum;
}

// vytvoreni pole
var pokus:Array = new Array();
// vytvoreni pole

found=0;
j=0;
pocet_cisel=10;

while (found==0) {
pokus[j] = randRange(1, 35);
pokus.sort(Array.NUMERIC); // serad cisla vzestupne
if (pokus[j] == pokus[j-1]) {
pokus[j] = randRange(1, 35);
//pokus[j] = "zamenim za: " + randRange(1, 35);
}
j = j+1;
found=0;

if (j==pocet_cisel) {
found=1;
}
}


To nefunguje, jak bych si predstavoval. Myslim si, ze je spatne zadana ta podminka, ktera mi zjistuje, jestli se v poli nektera cisla opakuji nebo ne. To bude asi to klicove.
Jirsak
Profil
Aha, Hanz me predbehl. Zkusim to a dam vedet.

Dekuji
Jirsak
Profil
Tak jsem to zkusil, jak mi popsal Hanz. Cisla uz se skutecne neopakuji. Ale je zde jiny zadrhel. Casto se stane, ze misto cisla napise "undefined". To si myslim, ze je misto tech zopakovanych cisel. Takze vypis vypada napriklad takto:
1,5,8,9,10,11,22,30,undefined,undefined

Nema to souvislost s toto casti kodu?

if (cislo == pole[a]) {
cislo = "";
}


Ne, ted na to koukam a asi ne. Nemel by ten cyklus byt neomezeny? Myslim v tom, kolikrat ma probehnout. Mel by totiz probehnout tolikrat, nez je pole plne cisel. Takze, pokud by nekde v poli bylo "undefined", musel by probehnout cyklus treba jeste po jedenacte, ackoliv chci pouze 10 cisel, aby "undefined" zmenil na hodnotu a pak teprve ukoncil naplnovani pole. Nebo se mylim?

Mozna jeste doupresnim, k cemu to ma slouzit, treba by to mohlo pomoct. Chci udelat nejaky test, kde bude nadefinovano treba 100 otazek. Z nich chci nahodne vybrat napriklad 10. A aby byl test jak ma byt, nemely by se v nem zadne otazky opakovat (jinak by clovek odpovidal treba na 9 otazek misto 10).
Hanz
Profil
Jirsak
Jo máš pravdu. Já jsem měl takové štěstí že mi to při každém zkoušení vyhodilo všude hodnoty :o)
Zprávně by to mělo být takto:
var pole:Array = new Array();

var i = 0;
while (pole.length<10) {
cislo = Math.round(Math.random()*(35-1))+1;
for (a=0; a<9; a++) {
if (cislo == pole[a]) {
cislo = "";
}
}
if (cislo != "") {
pole[i] = cislo;
i++;
}
}
pole.sort(Array.NUMERIC);


Při testování mi to opět vyhodilo samá čísla.
Jirsak
Profil
Ano, dekuji, ted skript funguje apsolutne spravne, tak jak jsem si to prestavoval.
Toto téma je uzamčeno. Odpověď nelze zaslat.

0