Discuss Scratch

koDoz
Scratcher
42 posts

gewichtete Zufallszahlen

(Mai 22, 2014) … für eine Animation benötige ich sog. gewichtete Zufallszahlen:

In einer Regen-Simulation ( http://scratch.mit.edu/projects/22555906 ) sollen die Tropfen vorne seltener fallen, als im Hintergrund. Die gewürfelten Zahlen (z=Entfernung im Raum) sollen also nicht gleichmäßig verteilt sein, viele große Zahlen - wenig kleine Zahlen.

Meine intuitive Lösung ist:

set (gewichtete Zufallszahl) to ([sqrt v] of (pick random (1) to ((max) * (max))))

Es scheint zu klappen. Aber was sagt der Mathematiker dazu? Gibt es andere Lösungen, mit der man die Häufigkeitsverteilung noch etwas flexibler einstellen kann?

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
(Mai 28, 2014) Nachlese: Schön, welche Resonanz dieses Thema hat. Dank den Kommentatoren! Aber schließlich kommt wohl kein Scratcher ohne Zufallsfunktionen aus, der Spiele, Simulationen, Art-Experimente usw schreibt. @TM_ hat daher den Artikel Zufallszahl im deutschsprachigen Scratch-Wiki angelegt. Dort werden dann umgehend die Ergebnisse dieses Forenthemas einfließen …

Last edited by koDoz (May 28, 2014 07:18:24)

MeDiaMond
Scratcher
500+ posts

gewichtete Zufallszahlen

deine Variante ist gut. Hier ist auch noch eine Variante:
set [random 1 v] to (pick random (1) to ([sqrt v] of (max)))
set [random 2 v] to (pick random (1) to ([sqrt v] of (max)))
set [gewichtete Zufallszahl v] to ((random 1)*(random 2))
TM_
Scratcher
1000+ posts

gewichtete Zufallszahlen

Sowas löse ich nach einem Prozentzahlen-Prinzip, ungefähr so:
set [r1 v] to (pick random (0) to (100))
if <[r1] < [60]> then
set [E v] to [wahrscheinliches Ereignis]
else
if <[r1] < [80]> then
set [E v] to [unwahrscheinliches Ereignis]
else
if <[r1] < [95]> then
set [E v] to [seltenes Ereignis]
else

set [E v] to [sehr seltenes Ereignis]
end
end
end

Natürlich muss man auch nicht 100 nehmen, es geht mit jeder Zahl. Das Ganze hat halt den Vorteil, dass die Verteilung recht überschaubar ist und man das Ganze schnell anpassen kann falls das aktuelle Ergebnis einem nicht gefällt

Da du aber wahrscheinlich viele Ereignisse hast, weil jedes z ein neues wäre, könntest du dann jedes Ereignis so definieren:
Das wahrschienliche: (falls z= 0 vorne und z=100 hinten) setze z auf random 100 bis 60
das seltenste: setze z auf random 20 bis 0. So ist es dann auchgewichtet

Last edited by TM_ (May 22, 2014 19:17:52)

fuenf
Scratcher
44 posts

gewichtete Zufallszahlen

ich wüßte noch:

Zufallszahl = max * sin( random( 1, typ))

z.B. mit max = 480 typ = 90

  • typ=90 erzeugt eine am Ende stark ansteigende Häufigkeit: /
  • typ=180 sollte die hohen Werte noch stärker betonen (nicht getestet)
  • typ=360 erzeugt auch negative Zahlen

Analog dazu lassen sich auch die kleinen Zahlen betonen: \

Zufallszahl = max * cos( random( 1, typ))

Nachtrag: Die Häufigkeit einzelner Zahlen steigt bei dieser Scratch-Lösung leider nicht kontinuierlich an, sondern erzeugt auch bei hohen Testdurchläufen in den kleinen Werte-Bereichen eine unerwartete regelmäßige kamm-artige Verteilung. Hmmm …

Last edited by fuenf (May 23, 2014 07:40:47)

TM_
Scratcher
1000+ posts

gewichtete Zufallszahlen

fuenf wrote:

ich wüßte noch:

Zufallszahl = max * sin( random( 1, typ))

z.B. mit max = 480 typ = 90

  • typ=90 erzeugt eine am Ende stark ansteigende Häufigkeit: /
  • typ=180 sollte die hohen Werte noch stärker betonen (nicht getestet)
  • typ=360 erzeugt auch negative Zahlen

Analog dazu lassen sich auch die kleinen Zahlen betonen: \

Zufallszahl = max * cos( random( 1, typ))

Nachtrag: Die Häufigkeit einzelner Zahlen steigt bei dieser Scratch-Lösung leider nicht kontinuierlich an, sondern erzeugt auch bei hohen Testdurchläufen in den kleinen Werte-Bereichen eine unerwartete regelmäßige kamm-artige Verteilung. Hmmm …


Die Sinus Funktion verläuft in einer Welle, siehe dazu einfach einige Bilder auf Google Die Cosinusfunktion auch, aber dise ist um Pi versetzt. Kann man mit dem Richtungsblock verwenden um schritte zu gehen. Denn bei 10er Schritten mitder Richtung 45° wird x ja nicht um 10 geändert. X wird um sin(Richtung) verändert und y um cos(Richtung). Es ist also nicht wie du es erst dachtest, dass eine immer stärker ansteigende Häufigkeit stattfindet. Sin(-90) ist = 0 und sin(90) ist = 0, sin von 0 hingegen ist 1. Aber da die Funktion nicht zick-zack, sondern kurvenartig verläuft, ändern sich die Werte auch nicht gleichmäßig wenn man den Wert den man in Sinus einsetzt immer um 1 erhöht.
Tohmis
Scratcher
100+ posts

gewichtete Zufallszahlen

Du könntest zwei Zufallszahlen ineinander verschachtel. Zufallszahl von (0) bis (Zufallszahl von 0 bis 100) dann ist es wahrscheinlicher niedrige Zahlen zu bekommen als hohe. Es geht schnell in nur einer Zeile. Man kann es nur nicht so genau einstellen
TM_
Scratcher
1000+ posts

gewichtete Zufallszahlen

Tohmis wrote:

Du könntest zwei Zufallszahlen ineinander verschachtel. Zufallszahl von (0) bis (Zufallszahl von 0 bis 100) dann ist es wahrscheinlicher niedrige Zahlen zu bekommen als hohe. Es geht schnell in nur einer Zeile. Man kann es nur nicht so genau einstellen

Einfach aber genial dass ich auf sowas noch nie gekommen bin ^^
Tohmis
Scratcher
100+ posts

gewichtete Zufallszahlen

TM_ wrote:

Tohmis wrote:

Du könntest zwei Zufallszahlen ineinander verschachtel. Zufallszahl von (0) bis (Zufallszahl von 0 bis 100) dann ist es wahrscheinlicher niedrige Zahlen zu bekommen als hohe. Es geht schnell in nur einer Zeile. Man kann es nur nicht so genau einstellen

Einfach aber genial dass ich auf sowas noch nie gekommen bin ^^
Dir is das noch nie eingefallen? Ich benutz des ständig. Is einfach praktisch^^
koDoz
Scratcher
42 posts

gewichtete Zufallszahlen

Tohmis wrote:

Du könntest zwei Zufallszahlen ineinander verschachtel. Zufallszahl von (0) bis (Zufallszahl von 0 bis 100) dann ist es wahrscheinlicher niedrige Zahlen zu bekommen als hohe. Es geht schnell in nur einer Zeile. Man kann es nur nicht so genau einstellen

Das ist es - jetzt fällt es mir wie Schuppen von den Augen. In den alten Basic-Zeiten wäre mir der Groschen bestimmt schneller gefallen. Für meine Regen-Simulation (wo es hinten in größerer Entfernung häufiger tropfen soll, als vorne) verwende ich dann also sinngemäß:

Zufallszahl = maxRandom - random( 1, random( 1, maxRandom))

Danke Dir @Tohmis für den Qualitätstipp, das war genau das, was ich brauche und natürlich den andern Scratchern Dank für's mit-denken.

Zusatz: Die ‘steigung’ der Häufigkeitsverteilung lässt sich mit zusätzlichen Verschachtelungen sogar noch extremer herauskitzeln:

Zufallszahl = random( 1, random( 1, random( 1, maxRandom)))

Last edited by koDoz (May 23, 2014 20:07:41)

Tohmis
Scratcher
100+ posts

gewichtete Zufallszahlen

koDoz wrote:

Tohmis wrote:

Du könntest zwei Zufallszahlen ineinander verschachtel. Zufallszahl von (0) bis (Zufallszahl von 0 bis 100) dann ist es wahrscheinlicher niedrige Zahlen zu bekommen als hohe. Es geht schnell in nur einer Zeile. Man kann es nur nicht so genau einstellen

Das ist es - jetzt fällt es mir wie Schuppen von den Augen. In den alten Basic-Zeiten wäre mir der Groschen bestimmt schneller gefallen. Für meine Regen-Simulation verwende ich dann also sinngemäß:

Zufallszahl = maxRandom - random( 1, random( 1, maxRandom))

Danke Dir @Tohmis für den Qualitätstipp, das war genau das, was ich brauche und den andern Scratchern Dank für's Interesse.

Zusatz: Die ‘steigung’ der Häufigkeitsverteilung lässt sich mit weiteren Verschachtelungen sogar noch weiter verstärken:

Zufallszahl = random( 1, random( 1, random( 1, maxRandom)))
Immer wieder gerne
Was ich noch nicht raushab. Kann man die wahrscheinlichkeit auch stärker angleichen? Also das Gegenteil von weiteren verschachtelungen.
koDoz
Scratcher
42 posts

gewichtete Zufallszahlen

Tohmis wrote:

koDoz wrote:

Tohmis wrote:

Du könntest zwei Zufallszahlen ineinander verschachtel. Zufallszahl von (0) bis (Zufallszahl von 0 bis 100) dann ist es wahrscheinlicher niedrige Zahlen zu bekommen als hohe. Es geht schnell in nur einer Zeile. Man kann es nur nicht so genau einstellen

Das ist es - jetzt fällt es mir wie Schuppen von den Augen. In den alten Basic-Zeiten wäre mir der Groschen bestimmt schneller gefallen. Für meine Regen-Simulation verwende ich dann also sinngemäß:

Zufallszahl = maxRandom - random( 1, random( 1, maxRandom))

Danke Dir @Tohmis für den Qualitätstipp, das war genau das, was ich brauche und den andern Scratchern Dank für's Interesse.

Zusatz: Die ‘steigung’ der Häufigkeitsverteilung lässt sich mit weiteren Verschachtelungen sogar noch weiter verstärken:

Zufallszahl = random( 1, random( 1, random( 1, maxRandom)))
Immer wieder gerne
Was ich noch nicht raushab. Kann man die wahrscheinlichkeit auch stärker angleichen? Also das Gegenteil von weiteren verschachtelungen.
Ufff! … Erst optimiere ich mal mein Projekt.
Und wenn ich heute nich pennen kann, dann werde ich es Dir anlasten
MeDiaMond
Scratcher
500+ posts

gewichtete Zufallszahlen

Wie wäre es damit:
set [andersrum gewichtete Zufallszahl v] to ((pick random (pick random (min) to (max)) to (max)) - (min))
Oder einfach so:
set [andersrum gewichtete Zufallszahl v] to ((max) - (pick random (min) to (pick random (min) to (max))
Tohmis
Scratcher
100+ posts

gewichtete Zufallszahlen

MeDiaMond wrote:

Wie wäre es damit:
set [andersrum gewichtete Zufallszahl v] to ((pick random (pick random (min) to (max)) to (max)) - (min))
Oder einfach so:
set [andersrum gewichtete Zufallszahl v] to ((max) - (pick random (min) to (pick random (min) to (max))
Genau diese Lösung hat er ja schon hingeschrieben
MeDiaMond
Scratcher
500+ posts

gewichtete Zufallszahlen

Stimmt, hab ich gar nicht gesehen.
Aber warum hast du dann das geschrieben?

Tohmis wrote:

Immer wieder gerne
Was ich noch nicht raushab. Kann man die wahrscheinlichkeit auch stärker angleichen? Also das Gegenteil von weiteren verschachtelungen.
Tohmis
Scratcher
100+ posts

gewichtete Zufallszahlen

MeDiaMond wrote:

Stimmt, hab ich gar nicht gesehen.
Aber warum hast du dann das geschrieben?

Tohmis wrote:

Immer wieder gerne
Was ich noch nicht raushab. Kann man die wahrscheinlichkeit auch stärker angleichen? Also das Gegenteil von weiteren verschachtelungen.
Deine Lösung löst dieses Problem leider auch nicht. Es schränkt nur den wert ein bzw. Kehrt ihn um.
Ich meinte, ob man auch das Gegenteil von weiteren verschachtelungen machen kann. Weniger als eine geht ja nicht.
MeDiaMond
Scratcher
500+ posts

gewichtete Zufallszahlen

Ach so. Ich dachte du meintest wie man mehr kleine als große zahlen bekommt.
forth
Scratcher
15 posts

gewichtete Zufallszahlen

Du könntest zwei Zufallszahlen ineinander verschachtel. Zufallszahl von (0) bis (Zufallszahl von 0 bis
Was ich noch nicht raushab. Kann man die wahrscheinlichkeit auch stärker angleichen? Also das Gegenteil von weiteren verschachtelungen.

@Thomis: Für weitere Parametrisierungen fehlt mir leider die mathematische Basis. Die vorliegenden Lösungen sind aber schon ziemlich robust und dürften schon viele Fälle abdecken!

Ich hab mal die Grafen einiger Formeln anzeigen lassen. Überraschend die Verläufe! (mein Sinus-Ansatz scheint ziemlicher Murks zu sein)

@TM_: Dein Vorschlag könnte man zu einer universellen Lösung weiter entwickeln und eine Werteliste erstellen. Man würfelt dann nur den Listenindex und kann so jede beliebige Verteilungsfunktion erstellen.
Tohmis
Scratcher
100+ posts

gewichtete Zufallszahlen

Ich hab noch was gefunden Is eigentlich ziemlich interressant das thema

Es geht so
((pick random (1) to (20.0)) * (pick random (1) to (5)))
Dabei ist es wichtig, das die beiden höchsten werte multipliziert den maximalwert ergeben und die beiden niedrigsten den minimalwert
in diesem fall 1 und 100
weitherhin ist wichtig, das bei mindestens einer zahl ein .0 dahintersteht,dami die zahlen enger zusammenliegen. wenn man will, kann man das ergebnis dann wieder runden.
wie stark es gewichtet is kann man dann durch ändern der werte realisieren
Tohmis
Scratcher
100+ posts

gewichtete Zufallszahlen

Ich hab sogar noch ne lösung einfach bestes thema
sieht so aus
((pick random (min) to (max)) mod (pick random (min) to (verteilung)))

Is definitiev besser als meine letzte lösung
Je höher verteilung ist, desto gleicher ist die warscheinlichkeit für jedes ergebnis von min bis max
Bei einem niedrigen verteilung ist das ergebnis mit einer höheren Warschenlichkeit niedrig
Ist sehr gut schnell und leicht einstellbar. und dazu ist es noch sehr einfach

Last edited by Tohmis (May 24, 2014 20:16:51)

koDoz
Scratcher
42 posts

gewichtete Zufallszahlen

forth wrote:

Ich hab mal die Grafen einiger Formeln anzeigen lassen.

Nun gibt es auch ein Remix mit der skalierbaren Formel von @Thomis: http://scratch.mit.edu/projects/22724118

Last edited by koDoz (May 24, 2014 21:55:33)

Powered by DjangoBB