ugrás a tartalomhoz

JavaScript véletlen generálás tömbből

morocztamas · 2012. Jan. 2. (H), 13.04
A problémám az, hogy nem megy az alábbi forrásom:
<script type='text/javascript'>
  var szamok = new Array ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'f');
  document.write ("<body style='background: #fff; text-align: center'>");
  for (var szam = 0; szam < 100; szam  ++) {
    var szinertek = '';
    for (ertek = 0; ertek < 6; ertek ++) {
      var szin = array_rand (szamok);
      szinertek += szamok[szin];
    }
    document.write ("<div style='background: #" + szinertek + "; display: inline-block; height: 40px; margin: 5px; padding: 50px; width: 200px;'><span style='color: #fff;'>#" + szinertek + "</span><br /><span style='color: #000;'>#" + szinertek + "</span></div>");
  }
  document.write ("</body>");
</script>
Mi miatt?
 
1

Én csak array_rand() PHP

kuka · 2012. Jan. 2. (H), 13.13
Én csak array_rand() PHP függvényt ismerek. Deklaráltál valahogy egyet JavaScriptben?
2

PHP a forrás eredetileg...

morocztamas · 2012. Jan. 2. (H), 13.19
...és azt akarom átírni JavaScript-be.
3

Akkor vagy írd meg az

kuka · 2012. Jan. 2. (H), 13.51
Akkor vagy írd meg az array_rand() függvényt JavaScriptben, vagy felejtsd el. Én az utóbbit javasolnám. A Math.random() bőven elegendő lesz ide.
4

Math.floor(Math.random() *

Poetro · 2012. Jan. 2. (H), 14.43
Math.floor(Math.random() * 16).toString(16)
illetve
szamok[Math.floor(Math.random() * szamok.length)]
Nem tudom, neked melyik a szinpatikusabb. Másik dolog, hogy ne használd a new Array, csak kivételes esetekben, mert esetleg kellemetlen meglepetések érhetnek, valamint lassabb is, mint a
szamok = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f']
5

Király

morocztamas · 2012. Jan. 2. (H), 15.04
Működik, hellyel közzel.
Hivatkozás rá.
Bár csak kevésszer generál le színt, mert belekerült valami undefinied(?) is.
6

e

Poetro · 2012. Jan. 2. (H), 15.20
A te tömbödből eleve kimaradt az e. De ami még fontosabb, hogy nem értetted azt az egy sor kódot, amit leírtam. Kérlek előbb azt értelmezd, mielőtt használod.
7

Felkeltette az érdeklődésemet

Hidvégi Gábor · 2012. Jan. 2. (H), 16.12
Felkeltette az érdeklődésemet a két definíciós forma közti sebességkülönbség, és írtam egy rövid scriptet:
<script type="text/javascript">
var szamok, i;
var ido1 = new Date().getTime();
for (i = 0; i < 100000; i++) {
  szamok = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'];
}
var ido2 = new Date().getTime();
for (i = 0; i < 100000; i++) {
  szamok = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f');
}
document.title = (new Date().getTime() - ido2) + ' - ' + (ido2 - ido1);
</script>

IE kivételével a többi böngészőben pont fordított eredmények jöttek ki (bár az előbbiben sem túl nagy a különbség, és többedszerre futtatva ott is győz a new Array()).

Arra gyanakszom, hogy az utóbbi idők JS motor optimalizálási versenyének köszönhető a változás.

Viszont a new Array() egy teljesen szabványos szerkezet, és egy böngészőben sem okozhat gondot a használata.

szerk.: még egy tesztet írtam, és ennek az eredményein még jobban meglepődtem, mint az előbb:
<script type="text/javascript">
var szamok, i;
var ido1 = new Date().getTime();
for (i = 0; i < 10000; i++) {
  szamok = {egy: '1', ketto: 'ketto', harom: 'harom', negy: 'negy', ot: 'ot', hat: 'hat', het: 'het', nyolc: 'nyolc', kilenc: 'kilenc', a: 'a', b: 'b', c: 'c', d: 'd', e: 'e', f: 'f'};
}
var ido2 = new Date().getTime();
for (i = 0; i < 10000; i++) {
  szamok = new Object();
  szamok.egy = '1', szamok.ketto = 'ketto', szamok.harom = 'harom', szamok.negy = 'negy', szamok.ot = 'ot', szamok.hat = 'hat', szamok.het = 'het', szamok.nyolc = 'nyolc', szamok.kilenc = 'kilenc', szamok.a = 'a', szamok.b = 'b', szamok.c = 'c', szamok.d = 'd', szamok.e = 'e', szamok.f = 'f';
}
document.title = (new Date().getTime() - ido2) + ' - ' + (ido2 - ido1);
</script>
9

Akkor általánosítsunk: a

kuka · 2012. Jan. 2. (H), 18.33
Akkor általánosítsunk: a literálok lassabbak. Például /^ize (bigyo) .*/ vs. new RegExp('^ize (bigyo) .*').

(Én úgy tartom, hogy a kódot ketten olvassuk: én és az interpreter. Ezért nem mindent az interpreter szájíze szerint írok. A literálokat azért használom, mert én könnyebben olvasom őket.)
10

Azért ez nekem nem teljesen

H.Z. v2 · 2012. Jan. 2. (H), 18.36
Azért ez nekem nem teljesen tiszta...
Kliens oldalon mikor érdemes egyáltalán a JS performanciájával foglalkozni? Már feltéve, hogy rendeltetésszerűen használjuk és nem írunk benne op.rendszert... ;)
(vagy az flashben íródott? lehet, hogy keverem)
12

Ha például alkalmazást

Hidvégi Gábor · 2012. Jan. 2. (H), 18.46
Ha például alkalmazást fejlesztesz és mondjuk sok ciklus van a kódban, akkor nagyon meg kell gondolni, mit és hogyan használsz.
13

Akkor bennem valami tévképzet

H.Z. v2 · 2012. Jan. 2. (H), 19.05
Akkor bennem valami tévképzet él a JS-ről.
Én még úgy kezeltem, mint egy HTML scriptelési lehetőséget, amit csak nagyon rövid feladatok kivitelezésére használunk. (akkor is, ha Ajax-szal dolgozunk)
Ha már applikációban gondolkodom, akkor inkább java webstart(??? remélem, nem keverem a szezont a fazonnal) vagy valami egyéb, vastag klienses megoldás.
---
Na jó, nem akarom ezt a témát szétoffolni, úgyhogy inkább hagyjuk is vagy menjünk át vele privátba.
16

Gmail, Goole Maps, Google Docs

Poetro · 2012. Jan. 2. (H), 19.50
Ha a fentieket Java-ban írták volna meg, valószínűleg senki nem használná. És a fentiek esetében igenis fontos, hogy jól optimalizált kód szülessen, mivel komoly terhelést jelent(het) a használatuk.
11

Miért lassabbak a literálok?

Hidvégi Gábor · 2012. Jan. 2. (H), 18.44
Miért lassabbak a literálok? Nem tanultam programozáselméletet, ezért nem tudom pontosan, mit jelentenek. Úgy értelmezném őket, hogy ha literált lát a fordító, akkor előbb átírja az objektum formára ([1, 2]-ből csinál egy new Array(1, 2)-t), azután dolgozza csak fel.
14

Kellemetlen meglepetés

Poetro · 2012. Jan. 2. (H), 19.37
A kellemetlen meglepetés leginkább akkor fog érni, ha a következőt írod:
var a = new Array(3);
console.log(a.length);
console.log(a[0]);
3
undefined
15

Nem tudom

Poetro · 2012. Jan. 2. (H), 19.49
Az összes teszt, amiket eddig láttam, szinte kivétel nélkül a literal-t hozta ki győztesnek illetve a kettőt azonosnak, pár böngészőt kivéve.
8

random(x, y)

Karvaly84 · 2012. Jan. 2. (H), 18.15
Egy egyszerű függvény, amivel x és y között kreálhatsz egy véletlen számot, beleértve x-et és y-t:

function random(x, y) {
    return Math.floor(Math.random() * (Math.abs(x - y) + 1)) + Math.min(x, y);
}