Wie erzeuge ich Zufallszahlen ohne rand()-Funktion?

Lesezeit: 3 Minuten

Benutzer-Avatar
AnkurVj

Ich möchte (Pseudo-) Zufallszahlen zwischen 0 und einer ganzen Zahl generieren. Ich habe nichts dagegen, wenn sie nicht zu zufällig sind. Ich habe Zugriff auf die aktuelle Uhrzeit, aber nicht auf die Randfunktion. Kann sich jemand einen ausreichend robusten Weg vorstellen, um diese zu generieren? Vielleicht einige Bits von der Tageszeit verwerfen und Modulo meiner ganzen Zahl nehmen oder so?

Ich benutze c.

  • Das klingt nach Hausaufgaben. Wenn dies der Fall ist, sollten Sie es mit dem Tag “Hausaufgaben” versehen.

    – Josh Darell

    29. September 2011 um 20:19 Uhr


  • Wenn Sie Zugriff auf google.com haben, suchen Sie nach: “Zufallszahlengenerator”.

    – DwB

    29. September 2011 um 20:19 Uhr

  • Warum nicht einfach ablesen /dev/random? Oder verwenden Sie die xkcd-Methode.

    Benutzer142019

    29. September 2011 um 20:21 Uhr


  • Was hindert Sie daran, einfach zu verwenden random() dann?

    – Staven

    29. September 2011 um 20:24 Uhr

  • rand() wird normalerweise sehr einfach implementiert (mit einer einfachen Multiplikation des Seeds und dann einer Mischung) … es geht normalerweise um eine Zeile. Google es einfach.

    – Seifenkiste

    29. September 2011 um 20:40 Uhr

Wenn Sie nach einem ultraeinfachen Pseudozufallsgenerator suchen, können Sie einfach a verwenden Schieberegister mit linearer Rückkopplung.

Der Wikipedia-Artikel enthält einige Code-Schnipsel, die Sie sich ansehen können, aber im Grunde sieht der Code für einen 16-Bit-Generator in etwa so aus (leicht massiert von dieser Seite …)

  unsigned short lfsr = 0xACE1u;
  unsigned bit;

  unsigned rand()
  {
    bit  = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 5) ) & 1;
    return lfsr =  (lfsr >> 1) | (bit << 15);
  }

  • Genau das, was ich brauchte! eine sehr einfache und elegante Lösung

    – AnkurVj

    29. September 2011 um 21:51 Uhr

  • Das funktioniert. Sie müssen nur den lfsr ändern, wenn Sie einen anderen Nummernstrom benötigen

    – dilanSachi

    15. Mai 2020 um 8:41 Uhr

Benutzer-Avatar
Dennis

Für “nicht zu zufällige” Ganzzahlen könnten Sie mit der aktuellen UNIX-Zeit beginnen und dann die rekursive Formel verwenden r = ((r * 7621) + 1) % 32768;. Die n-te zufällige Ganzzahl zwischen 0 (inklusive) und M (exklusiv) wäre r % M nach der n-ten Iteration.

Dies wird als linearer Kongruenzgenerator bezeichnet.

Die Rekursionsformel ist was bzip2 verwendet, um den Pivot in seiner Quicksort-Implementierung auszuwählen. Ich würde nichts über andere Zwecke wissen, aber es funktioniert ziemlich gut für diesen speziellen …

Sehen Sie sich die Implementierung eines Pseudo-Zufallsgenerators an (was “drin” ist) rand()) von Ihnen, zum Beispiel die Mersenne-Twister ist hoch angesehen.

Benutzer-Avatar
Rajan Saha Raju

#include <chrono>

int get_rand(int lo, int hi) {
    auto moment = std::chrono::steady_clock::now().time_since_epoch().count();
    int num = moment % (hi - lo + 1);
    return num + lo;
}

Der einzige “robuste” (nicht leicht vorhersehbare) Weg, dies zu tun, besteht darin, einen eigenen Pseudozufallszahlengenerator zu schreiben und ihn mit der aktuellen Uhrzeit zu versehen. Obligatorischer Wikipedia-Link: http://en.wikipedia.org/wiki/Pseudorandom_number_generator

Den “Tiny Mersenne Twister” bekommt ihr hier: http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/TINYMT/index.html

es ist reines c und einfach zu bedienen. ZB nur mit Zeit:

#include "tinymt32.h"
// And if you can't link:
#include "tinymt32.c"

#include <time.h>
#include <stdio.h>

int main(int argc, const char* argv[])
{
    tinymt32_t state;
    uint32_t seed = time(0);

    tinymt32_init(&state, seed);

    for (int i=0; i<10; i++)
            printf("random number %d: %u\n", i, (unsigned int)tinymt32_generate_uint32(&state));
}

Benutzer-Avatar
Haseb Mir

Das kleinste und einfachste Zufallsgenerator die mit arbeiten reicht ist unten mit einem voll funktionsfähigen Beispiel versehen.

unsigned int MyRand(unsigned int start_range,unsigned int end_range)
  {
    static unsigned int rand = 0xACE1U; /* Any nonzero start state will work. */

    /*check for valid range.*/
    if(start_range == end_range) {
        return start_range;
    }

    /*get the random in end-range.*/
    rand += 0x3AD;
    rand %= end_range;

    /*get the random in start-range.*/
    while(rand < start_range){
        rand = rand + end_range - start_range;
    }

    return rand;
  }

int main(void)
{
    int i;
    for (i = 0; i < 0xFF; i++)
    {
    printf("%u\t",MyRand(10,20));
    }
    return 0;
}

1385320cookie-checkWie erzeuge ich Zufallszahlen ohne rand()-Funktion?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy