ungerade Zufallszahlen

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