ungerade Zufallszahlen
am 25.09.2006 11:14:38 von guba
Hallo!
wie kann man ungerade Zufallszahlen erzeugen?
Irgendwie in der Richtung
$i_w =3D 4000;
$t_w =3D int(srand($i_w)) + 1;
if ($t_w gerade) {$t_w =3D $t_w + 1} else {$t_w =3D $t_w};
oder geht es einfacher? Danke für Hinweise
Günter
Re: ungerade Zufallszahlen
am 25.09.2006 11:29:48 von Hanspeter Schinz
guba@vi-anec.de wrote:
> Hallo!
>
> wie kann man ungerade Zufallszahlen erzeugen?
> Irgendwie in der Richtung
>
> $i_w = 4000;
> $t_w = int(srand($i_w)) + 1;
> if ($t_w gerade) {$t_w = $t_w + 1} else {$t_w = $t_w};
>
> oder geht es einfacher? Danke für Hinweise
>
> Günter
>
$t_w = 2 * int(srand($i_w)) + 1;
ergibt immer eine ungerade Zahl
Hanspeter
Re: ungerade Zufallszahlen
am 25.09.2006 11:45:02 von Christian Lackas
* Hanspeter Schinz [2006-09-25]:
Hallo Leute,
>> $i_w = 4000;
>> $t_w = int(srand($i_w)) + 1;
mit srand setzt man den Startwert des (Pseudo-)Zufallszahlengenerators
(möchte man idR gar nicht selbst machen, darum kümmert sich Perl beim
ersten Aufruf von rand() schon selbst).
Das liefert allerdings immer 1 zurück. Du meinst wahrscheinlich
rand()
> $t_w = 2 * int(srand($i_w)) + 1;
> ergibt immer eine ungerade Zahl
Das ist richtig, immer die 3.
Gruß
Christian
--
Als Mensch kann man vernünftig denken und trotzdem unsinnig handeln.
http://www.lackas.net/ Perl Delphi Linux MP3 Searchengines Domainchecker
Re: ungerade Zufallszahlen
am 25.09.2006 21:28:42 von Mirco Wahab
Thus spoke guba@vi-anec.de (on 2006-09-25 11:14):
> wie kann man ungerade Zufallszahlen erzeugen?
> Irgendwie in der Richtung
>
> $i_w = 4000;
> $t_w = int(srand($i_w)) + 1;
> if ($t_w gerade) {$t_w = $t_w + 1} else {$t_w = $t_w};
einfacher, denn die Anzahl der ungeraden
Zahlen aus 1..N ist die Anzahl der
geraden Zahlen aus 1..(N/1) "mal" 2 "plus" 1, z.B.:
...
sub rand_ungerade { ( int(rand((shift)>>1)) << 1 ) + 1; }
...
...
print rand_ungerade(100),"\n" for (1..10);
...
oder so ...
Viele Grüße
Mirco
Kontext der Aufgabe zu ungeraden Zufallszahlen
am 26.09.2006 18:16:43 von guba
Hallo,
ich muss doch den Kontext darstellen: Ich möchte aus einem
Bild ein Teil (gleichseitiges Dreieck) kopieren (werde PerlMagick
verwenden), dessen Seitenlänge $t_w [pixel] zufällig aus dem
Intervall
[$t_w_min, $t_w_max] gewählt werden soll. Sollte die
Zufallszahl jedoch gerade sein, so soll die nächstgrößere
ungerade Zahl verwendet werden, selbst wenn diese ausserhalb
des Intervalls liegen sollte.
$delta_t_w =3D $t_w_max - $t_w_min;
$t_w =3D $t_w_min + int(rand($delta_t_w));
if ($t_w odd) {$t_w =3D $t_w + 1} else {$t_w =3D $tr_w};
wie könnte man die dritte Zeile formulieren?
Danke für weitere Hinweise!
Günter
Re: Kontext der Aufgabe zu ungeraden Zufallszahlen
am 26.09.2006 18:23:11 von Frank Seitz
guba@vi-anec.de wrote:
> if ($t_w odd) {$t_w = $t_w + 1} else {$t_w = $tr_w};
>
> wie könnte man die dritte Zeile formulieren?
Stichwort: Modulo-Operator
if ($t_w % 2) ...
Grüße
Frank
--
Dipl.-Inform. Frank Seitz; http://www.fseitz.de/
Anwendungen für Ihr Internet und Intranet
Tel: 04103/180301; Fax: -02; Industriestr. 31, 22880 Wedel
Re: Kontext der Aufgabe zu ungeraden Zufallszahlen
am 26.09.2006 21:26:48 von hjp-usenet2
On 2006-09-26 16:16, guba@vi-anec.de wrote:
> ich muss doch den Kontext darstellen: Ich möchte aus einem
> Bild ein Teil (gleichseitiges Dreieck) kopieren (werde PerlMagick
> verwenden), dessen Seitenlänge $t_w [pixel] zufällig aus dem
> Intervall
> [$t_w_min, $t_w_max] gewählt werden soll. Sollte die
> Zufallszahl jedoch gerade sein, so soll die nächstgröÃere
> ungerade Zahl verwendet werden, selbst wenn diese ausserhalb
> des Intervalls liegen sollte.
>
> $delta_t_w = $t_w_max - $t_w_min;
> $t_w = $t_w_min + int(rand($delta_t_w));
Das stimmt nur, wenn das Intervall rechts offen ist, was aber auf Grund
des Namens $t_w_max nicht zu erwarten ist. Vermutlich musst Du noch 1 zu
$delta_t_w addieren.
> if ($t_w odd) {$t_w = $t_w + 1} else {$t_w = $tr_w};
>
> wie könnte man die dritte Zeile formulieren?
Vor allem erst mal Deiner Vorgabe entsprechend. So wie Du das
geschrieben hast, wählt es die nächste gerade Zahl, wenn $t_w ungerade
ist - das ist genau das Gegenteil von dem, was Du im Text beschrieben
hast. Wenn $t_w hingegen gerade ist, ersetzt Du es durch eine bisher
nirgends erwähnte Variable $tr_w. Falls das ein Tippfehler war und $t_w
heiÃen sollte: Welchen Zweck soll die Zuweisung $t_w = $t_w erfüllen?
Das tut nichts, also weg damit. Somit lautet Deine dritte Zeile, wenn
sie das ausdrücken soll, was Du im Text beschrieben hast:
if ($t_w even) {$t_w = $t_w + 1}
Jetzt geht es noch darum, "$t_w even" in Perl zu übersetzen. Eine gerade
Zahl ist eine, die ohne Rest durch zwei teilbar ist:
if ($t_w % 2 == 0) {$t_w = $t_w + 1}
$t_w = $t_w ist hässlich, das schreibt man besser als
if ($t_w % 2 == 0) { $t_w++ }
und mancher wird der Meinung sein, dass
$t_w++ unless $t_w % 2;
lesbarer ist (Damian Conway ist anderer Meinung).
SchlieÃlich wissen die Bitfitzler unter uns noch, dass bei ungeraden
Zahlen das niedrigstwertige Bit gesetzt ist. Also kann man das auch als
$t_w |= 1;
schreiben.
hp
--
_ | Peter J. Holzer | > Wieso sollte man etwas erfinden was nicht
|_|_) | Sysadmin WSR | > ist?
| | | hjp@hjp.at | Was sonst wäre der Sinn des Erfindens?
__/ | http://www.hjp.at/ | -- P. Einstein u. V. Gringmuth in desd