Ja, a második utastásnál csak azért van ott a véletlenszám két tizedesre kerekítése, mert tesztelgetés közben szeretem látni, hogy valóban véletlenszerű. ;-))
Súlyozott véletlenre én ezt kis MySQL lekérdezést találtam ki. Remélem, tetszik:
Adott egy "mp3 nevű tábla, benne egy "track" (VARCHAR(100)) és egy "pri" (SMALLINT) mezővel. Természetesen bármilyen mezőt felvehetsz, itt csak a "pri"-nek (prioritás) van jelentősége, ami egy tetszőleges egész szám (elég finoman lehet hangolni...;-)).
3 parancsot fűzök egymás után:
SELECT @prisum:=sum(pri) FROM mp3;
# Ez "prisum" néven tárolja a prioritások összegét.
SELECT @limit:=ROUND(RAND()*@prisum,2), @sum:=0;
# Ez "limit" néven létrehoz egy 0 és "prisum" közti küszöbszámot, és nulla kezdőértékkel definiálja a "sum"-ot.
SELECT @limit AS 'limit', @sum:=@sum+pri AS 'sum',track, pri, ROUND(pri/@prisum,2) AS '%' FROM mp3;
# Na ez a trükk. Ez a lekérdezés 5 oszlopot ad:
limit: Ez a második lépésben generált véletlenszerű küszöbszám értéke (minden sorban ugyanaz).
sum: a prioritások addigi összege
Tulajdonképpen eddig a lényeg, hiszen csak azt kell megvizsgálni a proginak, hogy a "sum" értéke mikor éri el a "limit"-et.
Ezek után még kiírja, hogy melyik trackről van szó, annak mekkora volt a prioritása, és, hogy %-ban mekkora volt a valószínűsége.
Én PHP-t használok, és a kiértékelés így néz ki:
while ($record = mysql_fetch_row($query) and ($record[0]>$record[1])) {$counter ++;};
A while ciklus végén a record tömb tartalmazza a súlyozottan, de véletlenszerűen kiválaszott track adatait, a counter változó pedig a sorszámát.
Lehet, hogy párszor végig kell olvasni, mire a homlokodra csapsz, de kb. annyi az ötlet, hogy van egy oszlopdiagram, ami a prioritásként megadott magasággú elemekből áll össze.
Először megméred, milyen magas a teljes oszlop, utána kérsz egy ennél nem nagyobb véletlen számot, és végül megvizsgálod, melyik kis oszlop-elembe esett ez a véletlen szám. Mindegyiknek pont annyi esélye van, amilyen magas, azaz amekkora a prioritása, és a kiválasztás véletlenszerű.
régóta gondolkodom azon, hogy a tracklisteket mysql-be kellene vinni, amiből lehetne pl. .m3u listát gyártani lekérdezéssel. csak akkor már azt is szeretném, hogy egyrészt véletlenszerűen játssza le a számokat, másrészt súlyozzam a számok lejátszásának valószínűségét tetszés szerint, valamint olyan progi legyen, amelyik mp3 és ogg számot is lejátszik és konzolos. én a véletlenszámoksúlyozásának problematikájánál akadtam el, meg az ogg és mp3 egyidejű előfordulásánál. de határozottan tetszik az adatbázis elképzelése, igaz, semmit nem csináltam eddig. viszont az userfree, és annyi és olyan listát generálsz jópofa lekérdezésekkel, amennyit és amilyent csak akarsz.
Nekem van is perl szkriptem, ami le tudja kerni a zeneszam cimet, stb, stb.
Ugy kepzelem el, hogy amikor elindul a gep, akkor mpg321(vagy mplayer) -rel jatszasz, amikor az X-ed elindult, akkor xmms-t inditani.
Az egyeduli problemat, a szamok ,,megakadasaban'' latok. (tehat hogy amikor az xmms indul, akkor tuti meg fog ugrani a zene, amit az mpg321 nyomott addig)