Eingeschränkte Zufallszahl

Servus,

ich habe folgendes Problem. In einer FOR Schleife mit Zehn runden soll zwischen rot und grün gewählt werden. Soweit so einfach. Kann ich ja einfach random(2) setzen, da kommt 0 oder 1 raus. Über Switch Case mach ich dann was damit.

Jetzt würde ich das aber gerne so reglementieren, das innerhalb der 10 Runden beispielsweise 8 mal rot und nur 2 mal grün kommt.

Hat jemand ne Idee??

Danke

In je einer Variable mit zählen, wieviele Male rot und grün kam. Wenn nur noch 1 Farbe möglich ist, diese ausgeben.

Gruß Tommy

:confused: ok, mach ich das nochmal mit einer for Schleife ?

hi,

oder ganz einfach: zufallszahlen von 1 bis 10 und bei kleiner gleich 2 isses grün, sonst rot.
damit hast Du zwar nicht FESTgelegt, daß das verhältnis so sein wird, aber so isses nun mal mit wahrscheinlichkeiten.

beim vorschlag des kollegen geht die zufälligkeit flöten, weil (aller wahrscheinlichkeit nach) die ersten vier versuche 2mal rot und 2mal grün sein werden und danach nur noch rot kommen darf.

gruß stefan

Wenn das Verhältnis genau eingehalten werden muss, legst du vorher zufällig fest, welche beiden Versuche der 10 grün sein soll. Das heißt, du erzeugst zweimal eine Zufallszahl 0-9, speicherst die in einem Array und beim späteren Durchlauf prüfst du bei jedem Wurf, ob er als Grün im Array verzeichnet ist.

Eisebaer:
beim vorschlag des kollegen geht die zufälligkeit flöten, weil (aller wahrscheinlichkeit nach) die ersten vier versuche 2mal rot und 2mal grün sein werden und danach nur noch rot kommen darf.

Das kann ich so nicht bestätigen:

start
ROTMAX: 8
GRUENMAX: 2
gruen
gruen
rot
rot
rot
rot
rot
rot
rot
rot
Start
ROTMAX: 8
GRUENMAX: 2
rot
rot
rot
rot
gruen
gruen
rot
rot
rot
rot
Start
ROTMAX: 8
GRUENMAX: 2
rot
gruen
gruen
rot
rot
rot
rot
rot
rot
rot

So habe ich es realisiert:

const uint8_t ANZAHL = 10;
const uint8_t ROTMAX = 8;
const uint8_t GRUENMAX = ANZAHL - ROTMAX;

uint8_t rot, gruen;

void setup() {
uint8_t zufall;
  Serial.begin(115200);
  Serial.println("Start");
  Serial.print("ROTMAX: ");Serial.println(ROTMAX);
  Serial.print("GRUENMAX: ");Serial.println(GRUENMAX);
  randomSeed(analogRead(A0));
  for(uint8_t i=0; i < ANZAHL; i++) {
    if (rot < ROTMAX && gruen < GRUENMAX) {
      zufall = random(2);
    }
    else {
      if (rot == ROTMAX) zufall = 1; // grün
      else zufall = 0;  // rot
    }
    if (zufall == 1) {
      Serial.println("gruen");
      gruen++;
    }  
    else {
      Serial.println("rot");
      rot++;
    }  
  }
}

void loop() {
  
}

Man könnte auch noch einen Auslöser über Serial hinzufügen. Ich habe zum Test einfach Reset gedrückt.

Gruß Tommy

Jetzt würde ich das aber gerne so reglementieren, das innerhalb der 10 Runden beispielsweise 8 mal rot und nur 2 mal grün kommt.

Wenn nur noch 1 Farbe möglich ist, diese ausgeben.

Die Wahrscheinlichkeit, dass die letzte Farbe ROT ist, ist so deutlich mehr als 8/10.

Wenn du das Zufallszahlen nennst, ok. Ansonsten ist Stefan Eisebärs Vorschlag natürlich besser.

Wenn du deine Idee ernst meinst, könntest du eine Zufallszahl zwischen 0 und 1023 ( 0x3FF = 10 bit ) würfeln, und falls diese genau 2 der 10 bit gesetzt hat, als komplettes Ergebnis für deine 10 Runden nehmen. ( Sonst natürlich weiter würfeln ) So kommen alle erlaubten 2 aus 10 Kombinationen gleichermaßen wahrscheinlich dran, und es sind sicher 2 grün und 8 rot.

Nachtrag: Theseus Idee (2 mal random(10) ) um die grün-Positionen festzulegen, ist einfach besser! Muss man nur aufpassen, dass beide unterschiedlich sind :wink:

hi,

stimmt absolut. wenn wirklich fix sein muß, daß dieses verhältnis bei 10 würfen eingehalten wird, ist theseus weg der beste.
nur weiß man dann halt meist, welche farbe bei den letzten würfen kommt.

wenn die wahscheinlichkeit 8 zu 2 sein soll, isses mein weg.

aber das muß der TO wissen.

gruß stefan

Danke! Das hat mir sehr viel geholfen, wenns fertig ist werde ich den entsprechenden Teil hier veröffentlichen. :slight_smile:

Also spannst Du uns auf die Folter wies Du es machen willst?

haha. Ich bin noch in der Denkphase....ich muss erst mal noch drum herum coden. Dann komm ich nochmal an den Punkt.

spannst Du uns auf die Folter

Bitte ja. Erst wenn's fertig ist.

Und bitte ohne for Schleife. Stört zwar nicht, wenn du dich hier blamierst, aber ist eben so. :wink:

Und dann ein YouTube Video wo man sieht, wie du dein Insider-Wissen ("nach zwei grünen ist der Rest rot") schamlos gegen Ahnungslose ausnutzt.

genau.....