844 Stimmen

Das Verständnis des "Zufalls"

Ich kann mir das nicht erklären, was ist zufälliger?

rand()

OR :

rand() * rand()

Ich finde es eine echte Denksportaufgabe, könnten Sie mir helfen?


EDITAR:

Intuitiv weiß ich, dass die mathematische Antwort lauten wird, dass sie gleichermaßen zufällig sind, aber ich kann mir nicht helfen, aber ich denke, dass, wenn man den "Zufallszahlenalgorithmus" zweimal laufen lässt, wenn man die beiden miteinander multipliziert, etwas Zufälligeres entsteht als wenn man es nur einmal macht.

5 Stimmen

Hier eine naive Definition für "Zufälliger": Für manche bedeutet "zufällig" "schwer zu erraten", z. B. den Wert der obersten Karte im Stapel zu erraten. Durch das Mischen des Stapels scheint es, dass der Zufallswert "noch schwerer zu erraten" ist, und von diesem praktischen, intuitiven Verständnis des Zufalls ausgehend, wäre es sinnvoll, den Stapel im Programm auf irgendeine Weise zu "mischen". Natürlich ist das nicht das, was "Zufall" bedeutet, und die Wissenschaft der Einführung von Entropie in einen pseudozufälligen Prozess ist nicht annähernd so einfach wie das Mischen des Prozesses mit seiner eigenen Ausgabe.

0 Stimmen

Danke @Yi Jiang und @Sam Saffron für die Korrekturen, ich bin eine Tippfehler-Maschine :)

0 Stimmen

@Mild Fuzz: Die Natur leugnet unendliche Unendlichkeiten? Sind das nicht Infinitesimale? Gibt es keine Fraktale in der Natur? Oder habe ich Ihre Aussage aufgrund meiner eigenen Dummheit völlig falsch verstanden?

1voto

HamoriZ Punkte 2283

Wir können zwei Arrays von Zahlen hinsichtlich der Zufälligkeit vergleichen, indem wir Kolmogorow-Komplexität Wenn die Zahlenfolge nicht komprimiert werden kann, dann ist sie die zufälligste, die wir bei dieser Länge erreichen können... Ich weiß, dass diese Art der Messung eher eine theoretische Option ist...

1voto

John S. Punkte 606

Wenn man mal darüber nachdenkt rand() * rand() es weniger zufällig als rand() . Hier ist der Grund dafür.

Im Grunde genommen gibt es genauso viele ungerade wie gerade Zahlen. Und wenn man sagt, dass 0,04325 ungerade ist, dann ist 0,388 gerade, 0,4 gerade und 0,15 ungerade,

Das bedeutet, dass rand() hat eine gleiche Chance, eine gerade oder ungerade Dezimalzahl zu sein .

Andererseits, rand() * rand() sind die Chancen ein wenig anders verteilt. Sagen wir:

double a = rand();
double b = rand();
double c = a * b;

a y b beide haben eine 50-prozentige Chance, gerade oder ungerade zu sein. Wissend, dass

  • gerade * gerade = gerade
  • gerade * ungerade = gerade
  • ungerade * ungerade = ungerade
  • ungerade * gerade = gerade

bedeutet, dass es eine 75%ige Chance dass c gerade ist, während nur ein 25%ige Chance ist es merkwürdig, dass der Wert von rand() * rand() besser vorhersehbar als rand() und damit weniger zufällig.

0voto

johnny Punkte 11

Verwenden Sie ein Schieberegister mit linearer Rückkopplung (LFSR), das ein primitives Polynom implementiert.

Das Ergebnis ist eine Folge von 2^n Pseudo-Zufallszahlen, d. h. keine Wiederholung in der Folge, wobei n die Anzahl der Bits im LFSR .... ist, was zu einer Gleichverteilung führt.

http://en.wikipedia.org/wiki/Linear_feedback_shift_register http://www.xilinx.com/support/documentation/application\_notes/xapp052.pdf

Verwenden Sie einen "zufälligen" Seed, der auf Mikrosekunden Ihrer Computeruhr basiert, oder vielleicht eine Teilmenge des md5-Ergebnisses auf einigen sich ständig ändernden Daten in Ihrem Dateisystem.

Ein 32-Bit-LFSR erzeugt beispielsweise 2^32 eindeutige Zahlen in Folge (keine 2 gleichen), beginnend mit einem gegebenen Startwert. Die Reihenfolge ist immer gleich, aber der Startpunkt ist (natürlich) für verschiedene Seeds unterschiedlich. Wenn also eine sich möglicherweise wiederholende Sequenz zwischen den Seedings kein Problem darstellt, könnte dies eine gute Wahl sein.

Ich habe 128-Bit-LFSRs verwendet, um Zufallstests in Hardwaresimulatoren zu generieren und dabei einen Seed zu verwenden, der die md5-Ergebnisse von sich ständig ändernden Systemdaten darstellt.

0voto

Salman A Punkte 246207

Unter der Annahme, dass rand() gibt eine Zahl zwischen [0, 1) es ist offensichtlich, dass rand() * rand() wird gegen 0 tendieren, weil die Multiplikation von x um eine Zahl zwischen [0, 1) ergibt eine Zahl, die kleiner ist als x . Hier ist die Verteilung von 10000 mehr Zufallszahlen:

google.charts.load("current", { packages: ["corechart"] });
google.charts.setOnLoadCallback(drawChart);

function drawChart() {
  var i;
  var randomNumbers = [];
  for (i = 0; i < 10000; i++) {
    randomNumbers.push(Math.random() * Math.random());
  }
  var chart = new google.visualization.Histogram(document.getElementById("chart-1"));
  var data = new google.visualization.DataTable();
  data.addColumn("number", "Value");
  randomNumbers.forEach(function(randomNumber) {
    data.addRow([randomNumber]);
  });
  chart.draw(data, {
    title: randomNumbers.length + " rand() * rand() values between [0, 1)",
    legend: { position: "none" }
  });
}

<script src="https://www.gstatic.com/charts/loader.js"></script>

<div id="chart-1" style="height: 500px">Generating chart...</div>

Si rand() gibt eine ganze Zahl zwischen [x, y] dann haben Sie folgende Verteilung. Beachten Sie die Anzahl der ungeraden und geraden Werte:

google.charts.load("current", { packages: ["corechart"] });
google.charts.setOnLoadCallback(drawChart);
document.querySelector("#draw-chart").addEventListener("click", drawChart);

function randomInt(min, max) {
  return Math.floor(Math.random() * (max - min + 1)) + min;
}

function drawChart() {
  var min = Number(document.querySelector("#rand-min").value);
  var max = Number(document.querySelector("#rand-max").value);
  if (min >= max) {
    return;
  }
  var i;
  var randomNumbers = [];
  for (i = 0; i < 10000; i++) {
    randomNumbers.push(randomInt(min, max) * randomInt(min, max));
  }
  var chart = new google.visualization.Histogram(document.getElementById("chart-1"));
  var data = new google.visualization.DataTable();
  data.addColumn("number", "Value");
  randomNumbers.forEach(function(randomNumber) {
    data.addRow([randomNumber]);
  });
  chart.draw(data, {
    title: randomNumbers.length + " rand() * rand() values between [" + min + ", " + max + "]",
    legend: { position: "none" },
    histogram: { bucketSize: 1 }
  });
}

<script src="https://www.gstatic.com/charts/loader.js"></script>

<input type="number" id="rand-min" value="0" min="0" max="10">
<input type="number" id="rand-max" value="9" min="0" max="10">
<input type="button" id="draw-chart" value="Apply">

<div id="chart-1" style="height: 500px">Generating chart...</div>

-1voto

Loki Punkte 28114

OK, ich werde also versuchen, die Antworten der anderen zu ergänzen, indem ich sage, dass Sie einen Zufallszahlengenerator erstellen und verwenden.

Zufallszahlengeneratoren sind Geräte (in einem sehr allgemeinen Sinne), die mehrere Eigenschaften haben, die für einen bestimmten Zweck geändert werden können. Einige von ihnen (von mir) sind:

  • Entropie: wie die Shannon-Entropie
  • Verteilung: statistische Verteilung (Poisson, Normal, usw.)
  • Art: Quelle der Zahlen (Algorithmus, natürliches Ereignis, Kombination von usw.) und angewandter Algorithmus.
  • Effizienz: Schnelligkeit oder Komplexität der Ausführung.
  • Muster: Periodizität, Sequenzen, Läufe usw.
  • und wahrscheinlich noch mehr...

In den meisten Antworten steht die Verteilung im Mittelpunkt des Interesses, aber durch das Mischen und Anpassen von Funktionen und Parametern schaffen Sie neue Möglichkeiten zur Erzeugung von Zufallszahlen, die unterschiedliche Merkmale aufweisen, deren Bewertung auf den ersten Blick vielleicht nicht offensichtlich ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X