ugrás a tartalomhoz

Tömb összefűzés véletlen sorrendben.

cica · 2013. Nov. 24. (V), 18.11
Üdv!

Abban kérem a segítségeteket hogyan lehetne egy tömböt más tömbökkel feltölteni véletlenszerű sorrendben.
A tomb.concat az ok, a véletlen sorrend a probléma. A feltöltés után összekeverni az most nem jó.

Köszi a segítséget.
 
1

Random

Poetro · 2013. Nov. 24. (V), 20.57
Szerintem legyen ennyi elég kezdésnek, a többit ki tudod találni.
[1,2,3,4,5].sort(function () {return Math.random() - 0.5;});
2

Rossz ötlet

Rici · 2013. Nov. 24. (V), 22.49
Ez helytelen. Egy elég részletes és jó elemzés a témáról:

http://www.robweir.com/blog/2010/02/microsoft-random-browser-ballot.html
3

Helytelen

Poetro · 2013. Nov. 24. (V), 23.08
A cikkben használt véletlenszám generátor is helytelen, ugyanis nem helyes elolszlással generálja a számokat.
function array_shuffle (aArray) {
    for (var mTemp, j, i = aArray.length; i; ) {  // mTemp, j initialized here for shorter code
        j = parseInt (Math.random () * i);  // introduces modulo bias (see below)
        mTemp = aArray[--i];
        aArray[i] = aArray[j];
        aArray[j] = mTemp;
    }
}
Ugyanis a parseInt miatt valószínűbb lesz, hogy a j közelebb fog állni 0-hoz mint i - 1-hez (és egyébként sem használunk parseInt-et kerekítéshez).
A fenti példámnak nem is az volt a célja, hogy helyes megoldást szolgáltasson, hanem, hogy elindulhasson valamerre a kérdező.
4

Milyen lesz az eloszlás? Én

Rici · 2013. Nov. 24. (V), 23.50
Milyen lesz az eloszlás? Én úgy látom ezen kód alapján, hogy egyenlő eséllyel választ a 0,1,...,i-1 számok közül egyet. A Math.random() az egyeneletes eloszlású a [0,1) intervallumban. A Math.random()*i egyenletes eloszlású a [0,i) intervallumban. Ezt egészre csonkolva a 0,1,...,i-1 egész számok közül egyenlő eséllyel lesz egy kiválasztva. Kérlek írd le, hol nem jó ez a gondolatmenet.

Azt ugye érzed, hogy az elég furcsa érvelés egy rossz javaslat megvédésére, hogy nem is akartál helyes megoldást mutatni. :)
5

Eloszlás

Poetro · 2013. Nov. 25. (H), 01.08
Igazad van, nem gondoltam bele az eloszlásba. De sajnos nem tudom, a kérdező pontosan mit is akar, és talán előre tudom mozgatni a gondolkodását. Sőt, az is lehet, hogy ő sem tudja mit is akar, vagy csak nem tudja leírni.
6

Azt ugye érzed, hogy az elég

Hidvégi Gábor · 2013. Nov. 25. (H), 10.08
Azt ugye érzed, hogy az elég furcsa érvelés egy rossz javaslat megvédésére, hogy nem is akartál helyes megoldást mutatni.
Poetro teljesen jó választ adott, megpróbálta rávezetni a kérdezőt; az, hogy ez nem tökéletes minden szempontból, már részletkérdés, majd az utána jár, akit érint.
7

Teljesen jó válasz?

Rici · 2013. Nov. 25. (H), 11.04
Poetro teljesen jó választ adott

Ez elég viccesen hangzik. Anélkül, hogy bántanék bárkit, mondjuk inkább úgy, hogy teljesen rossz választ adott. Ezzel nem akarok senkit megsérteni, természetes, hogy hibázunk. Sőt, a random shuffle-re ez egy elsőre rövid, elegáns és vonzó megoldásnak tűnik.

Hogy miért állítom, hogy a válasz teljesen rossz:

1. Hibás, mert nem egyenletes eloszlást generál, lásd a korábban linkelt cikket.
2. Lassú, mert rendezés van benne, ami O(n * log n) futási idejű, holott a random shuffle könnyen megoldható az elméleti minimum O(n) időben is.
3. Megsérti az Array sort függvény contract-ját, miszerint olyan összehasonlító függvényt kellene használni, ami konzisztens, tehát ugyanolyan bemenetekre mindig ugyanolyan kimenetet ad.

megpróbálta rávezetni a kérdezőt

Egy fórumon, ahol minőségi válaszokat várunk, ott szerintem nem jó, ha a láthatóan tapasztalatlan kérdezőt rávezetjük egy koncepciójában és implementációjában is rossz irányra.
8

Az, hogy mi a minőségi

Hidvégi Gábor · 2013. Nov. 25. (H), 11.35
Az, hogy mi a minőségi válasz, teljesen egyénfüggő. Én például nem szeretem a szájába rágni a kérdezőnek, a legtöbbször azért, mint itt is, mert arra sem veszi a fáradságot, hogy átnézze a dokumentációt, és a rendelkezésre álló lehetőségekből összekombinálja a megoldást.

Bár az általad adott link, valamint a fenti magyarázatod technológiailag megállja helyét, és a te szinteden álló embereknek ezt kell adni, jelen esetben a kérdező szemmel láthatólag kezdő. Emiatt szerintem sokkal jobb a Poetro-féle rávezetés, valamint annak az ösztönzése, hogy jöjjön tisztába az alapokkal, utána ráér finomítani, mert számára jelenleg irreleváns, hogy a Microsoftnál nem tudnak programozni.

Emiatt inkább a te válaszod hibás a jelen esetben, ráadásul az általad linkelt oldalon kezdőknek nem egyértelmű (ha megértik a hosszas elemzést), hogyan tudnák beépíteni az algoritmust a saját oldalukba.

A magam részéről viszont köszönöm, hogy rávilágítottál a véletlenszámgenerátor hibájára, be is tettem az oldalt a kedvencek közé.
9

+1

zzrek · 2013. Nov. 25. (H), 11.44
Én a jó oldalát látom a dolognak.
Szerintem jó, hogy Poetro válaszolt és az is jó, hogy "javítva lett".
Mindkét hozzászólás teljesen pozitív és -- mondhatom -- elvárt egy ilyen fórumon.
:-)
10

Nem tudjuk meggyőzni egymást

Rici · 2013. Nov. 25. (H), 11.56
A végtelenségig győzködhetnénk egymást.

Te nem fogadod el, hogy didaktikailag helytelen egy koncepcionálisan rossz válasz, és egyáltalán nem jó ötlet egy kezdőt rossz irányba terelni.

Én pedig nem fogadom el azt az állításodat, hogy szerinted teljesen jó dolog egy magyarázat (vagy hivatkozások) nélküli, elvi hibákat tartalmazó válasz, mert azzal egy kezdő igenis jól fog járni, és milyen jó lesz a világnak.

Az valóban teljesen irreleváns, hogy a Microsoftnál hogy tudnak programozni. A mellékelt cikknek ugyan ez az aprópója, de a cikk tartalma ettől a kontextustól függetlenül állja meg a helyét, és ettől a kontextustól függetlenül linkeltem be. Ha valamiért MS hatert vagy fanboyt látsz bennem, akkor biztosan állíthatom, hogy tévedsz.
11

Valóban máshogy látjuk a

Hidvégi Gábor · 2013. Nov. 25. (H), 12.13
Valóban máshogy látjuk a dolgokat, de azok alapján, amit itt írsz, szerintem félreértettél.

Az utolsó bekezdéshez viszont hozzátenném, hogy nem gondoltam egyáltalán, hogy bajod lenne a Microsofttal, hasonló hibákat a többi szoftvergyártó/programozó is elkövet.
20

+1

Pepita · 2013. Nov. 25. (H), 21.01
Így igaz, annyit tennék hozzá, hogy Poetroban egy tanár veszett el (és nincs nagyon elveszve), mert nagyon is ráérez az adott embereknél, hogy mivel tudja utánajárásra / tanulásra sarkallni. Első válasza is pont ilyen volt, még jó, hogy nem kezdjük el leírni ilyenkor egy kezdőnek az űrrakéták vezérlését...
12

Szigorúan véve ez nem igaz, a

tgr · 2013. Nov. 25. (H), 13.05
Szigorúan véve ez nem igaz, a Math.random() egy IEEE744 floating pointot ad vissza, ami feltehetőleg diszkrét egyenletes eloszlású lesz az n*2^-53 (n=0...2^53-1) számokon; ha ezt megszorzod teszem azt hárommal, akkor 2^53 érték oszlik el 3 tartományban, tehát a [2,3)-ba eggyel kevesebb érték kell hogy kerüljön.

A gyakrolatban nyilván az az egyenletestől való 2^-53 nagyságrendű eltérésnek nincs jelentősége, meg nem is lehet kiküszöbölni... de ha már vitatkoztatok róla.
13

pontosítok

cica · 2013. Nov. 25. (H), 15.17
tomb=[];
tomb1 = [ ["első fele",2],
 ["második fele",3]];
 
tomb2 = [ ["első része",4],
 ["második része",5],
 ["harmadik része",6]];
 tomb=tomb.concat(tomb1); //itt kellene véletlennek lennie
 document.writeln(tomb);


Ilyet szeretnék készíteni. A tomb feltöltése tomb1 és tomb2 mezővel véletlen legyen. Egyébként sokkal több tömb van. tomb1, tomb2, ... tömb20.
A shuffle azért nem jó mert az egymáshoz kapcsolódó tömbelemek elkeverednek.
A tömb1-ben, a tömb2-ben stb. muszály hogy egymás után maradjanak az elemek.
Remélem érthető voltam.
14

Tömbök tömbje

Rici · 2013. Nov. 25. (H), 15.19
A megoldás, hogy mielőtt még összefűznéd a tömböket, egy külső tömbbe gyűjtöd őket. A külső tömbön hajtasz végre shuffle műveletet, tehát a belső tömböket kevered. De egy adott belső tömbön belül már nem. A végén pedig egymás után fűzöd a belső tömbök elemeit.
15

Ezt nem értem :( "A külső

cica · 2013. Nov. 25. (H), 16.08
Ezt nem értem :(
"A külső tömbön hajtasz végre shuffle műveletet, tehát a belső tömböket kevered. De egy adott belső tömbön belül már nem."

A tomb1 ... tömb20 elemei saját magukon belül nem keveredhetnek. Ezek sorrendje adott. Egész tömböket kellene véletlenszerűen egyesíteni.
16

Így?

Poetro · 2013. Nov. 25. (H), 16.14
tomb.concat(array_shuffle(tomb1));
17

majdnem

cica · 2013. Nov. 25. (H), 16.25
Ez pontosan azt keveri össze amit nem kellene, legalábbis nekem.

A tomb1 ... tömb20 csak ezek sorrendjét kellene keverni az egyes tömbök elemeinek változatlannak kellene maradni. A tomb1 elemeinek meg a többinek is ugyanabban a sorrendben kellene maradnia.
18

vázlat

Rici · 2013. Nov. 25. (H), 16.38
tomb=[tomb1,tomb2,tomb3,tomb20];
// Ekkor shuffle művelet a tomb változón.
// Tehát csak a tomb1, tomb2, tomb3 stb keveredik egymáshoz képest.
// De abba bele sem nézel, hogy valójában tomb1 belül egy tömb.

// Aztán egymás után fűzöd a tomb változóban lévő belső tömbök tartalmát.
// Tehát konkatenálod a tomb[0], tomb[1] stb. belső tömböket.
19

ok

cica · 2013. Nov. 25. (H), 16.42
Hogy erre nem gondoltam. Tiéd a pont.

Köszi