[PYTHON] Wahrscheinlichkeit der höchsten und niedrigsten Jungtierpreise in Atsumori

Überblick

Der Verkaufspreis von Jungen (Wochentagspreise bei Tanuki Shoten) in "Atsumare Animal Forest" soll zwischen 9 und 660 Glocken </ b> schwanken, insbesondere der höchste Preis von 660 Glocken und der niedrigste Preis von 9 Glocken. Es wird gesagt, dass es sehr selten ist, herauszukommen. Berechnen wir daher die Wahrscheinlichkeit, dass in einer bestimmten Woche die höchsten und niedrigsten Preise erscheinen.

Annahme

  • Die zu berechnende Wahrscheinlichkeit ist ein Wert, der konvergiert, wenn die Anzahl der Spielwochen gegen unendlich geht.
  • Es wird davon ausgegangen, dass das Analyseergebnis des folgenden Algorithmus zur Bestimmung des Cub-Werts (Stand: 13. Juli 2020) korrekt ist. https://gist.github.com/Treeki/85be14d297c80c8b3c0a76375743325b
  • Das Ändern der Zeit im Spiel von der tatsächlichen Zeit (sogenannte Zeitoperation) darf nicht durchgeführt werden.
  • Das Finden der Regelmäßigkeit in Pseudozufallszahlen und das Anpassen an einen bestimmten Wert (sogenannte Zufallszahlenanpassung) darf nicht durchgeführt werden.

Cub Preisschwankungsmuster

Das Schwankungsmuster des Jungtierpreises kann grob in die folgenden vier Typen unterteilt werden.

  1. Typ verringern </ b>: Er nimmt monoton ab und überschreitet den Kaufpreis nicht.
  2. Wave </ b>: Wiederholen Sie den Vorgang mehrmals, um den Wert nahe am Kaufpreis zu halten.
  3. Großer Sprung </ b>: Nach einer monotonen Abnahme beginnt er zuzunehmen, erreicht einen großen Höhepunkt und nimmt ab.
  4. Kleiner Sprung </ b>: Nach einer monotonen Abnahme beginnt sie zuzunehmen, erreicht einen kleinen Höhepunkt und nimmt ab.

Der höchste Preis tritt nur in "3. Großer Sprung" auf, und der niedrigste Preis tritt nur in "4. Kleiner Sprung" auf. Versuchen Sie daher zunächst, die Wahrscheinlichkeit für jeden Typ zu ermitteln.

Die Wahrscheinlichkeit, jeder Typ zu werden, wird nur durch den Typ der Vorwoche (Markov-Kette) bestimmt, wie in der folgenden Tabelle gezeigt. (Codezeilen der Analyseergebnisse 135-209)

Letzte Woche\diese Woche Reduzierter Typ Wellentyp Bounce groß Bounce klein
Reduzierter Typ 5% 25% 45% 25%
Wellentyp 15% 20% 30% 35%
Bounce groß 20% 50% 5% 25%
Bounce klein 15% 45% 25% 15%

Versuchen Sie anhand dieser Tabelle, die Wahrscheinlichkeit (stetige Verteilung) zu ermitteln, dass jeder Typ konvergiert, wenn sich die Anzahl der Spielwochen nach der Methode der folgenden Site der Unendlichkeit nähert. (Es ist notwendig zu beweisen, dass es tatsächlich konvergiert, aber es wird hier weggelassen.) https://withcation.com/2020/01/23/%E3%83%9E%E3%83%AB%E3%82%B3%E3%83%95%E9%80%A3%E9%8E%96%E3%81%AE%E5%AE%9A%E5%B8%B8%E5%88%86%E5%B8%83%E3%82%92%E8%A7%A3%E3%81%8F/

Unter der Annahme, dass die Wahrscheinlichkeiten für reduzierten, welligen, großen und kleinen Sprung $ a, b, c bzw. d $ sind, gilt die folgende Gleichung.

\begin{pmatrix}
a & b & c & d
\end{pmatrix}
\begin{pmatrix}
0.05 & 0.25 & 0.45 & 0.25 \\
0.15 & 0.20 & 0.30 & 0.35 \\
0.20 & 0.50 & 0.05 & 0.25 \\
0.15 & 0.45 & 0.25 & 0.15 \\
\end{pmatrix}
=
\begin{pmatrix}
a & b & c & d
\end{pmatrix}

Transfer

\begin{pmatrix}
a & b & c & d
\end{pmatrix}
\begin{pmatrix}
-0.95 & 0.25 & 0.45 & 0.25 \\
0.15 & -0.80 & 0.30 & 0.35 \\
0.20 & 0.50 & -0.95 & 0.25 \\
0.15 & 0.45 & 0.25 & -0.85 \\
\end{pmatrix}
=
\begin{pmatrix}
0 & 0 & 0 & 0
\end{pmatrix}

Auf den ersten Blick scheint es, dass die gleichzeitigen Gleichungen von 4 Gleichungen mit 4 Arten von Zeichen in einer Matrix ausgedrückt werden. Wenn jedoch 3 Gleichungen transformiert werden, bleibt die verbleibende 1-Gleichung übrig, sodass eine Gleichung fehlt (4x4-Matrix). Der Matrixausdruck von ist 0 und die inverse Matrix kann nicht erhalten werden. Betten Sie daher $ a + b + c + d = 1 $ in eine beliebige Spalte ein (hier die erste Spalte).

\begin{pmatrix}
a & b & c & d
\end{pmatrix}
\begin{pmatrix}
1 & 0.25 & 0.45 & 0.25 \\
1 & -0.80 & 0.30 & 0.35 \\
1 & 0.50 & -0.95 & 0.25 \\
1 & 0.45 & 0.25 & -0.85 \\
\end{pmatrix}
=
\begin{pmatrix}
1 & 0 & 0 & 0
\end{pmatrix}
\\
\begin{pmatrix}
a & b & c & d
\end{pmatrix}
=
\begin{pmatrix}
1 & 0 & 0 & 0
\end{pmatrix}
\begin{pmatrix}
1 & 0.25 & 0.45 & 0.25 \\
1 & -0.80 & 0.30 & 0.35 \\
1 & 0.50 & -0.95 & 0.25 \\
1 & 0.45 & 0.25 & -0.85 \\
\end{pmatrix}^{-1}
=
\begin{pmatrix}
0.1476 & 0.3463 & 0.2474 & 0.2588
\end{pmatrix}

Die Wahrscheinlichkeit jedes Typs wurde berechnet. Der Python-Code wird unten gezeigt.

import numpy as np

A = np.array(
    [[0.05, 0.25, 0.45, 0.25],
    [0.15, 0.20, 0.30, 0.35],
    [0.20, 0.50, 0.05, 0.25],
    [0.15, 0.45, 0.25, 0.15]]
    )

A -= np.identity(4)  #Überleitung
A[:, 0] = 1  #Bedingung a+b+c+d=Setzen Sie 1
B = np.array([1, 0, 0, 0])

print(B @ np.linalg.inv(A))  # [0.1476074  0.34627733 0.24736279 0.25875248]

Wahrscheinlichkeit, den höchsten Wert zu erreichen (660 Glocken)

Um den Maximalwert (660 Glocken) zu erreichen, sind zusätzlich zu "3. Großer Sprung" (Wahrscheinlichkeit 0,2474) die folgenden Bedingungen erforderlich.

A: Der Kaufpreis der Insel (der Preis, den Sie am Sonntagmorgen bei Uri kaufen können) beträgt 90-110 Glocken, was 110 Glocken entspricht. </ b> B: In Spitzenzeiten beträgt der Kaufpreis das 2- bis 6-fache, der Kaufpreis jedoch das 6-fache. </ b>

Für A ist es zufällig (Randint in Zeile 123 des Codes) und die Wahrscheinlichkeit ist $ \ frac {1} {21} $. Generieren Sie für B zunächst einen numerischen Float-Wert von 2,0 bis 6,0 als Vergrößerung, aber der Spitzenpreis beträgt nicht genau das 6,0-fache, da er das Ergebnis von (Kaufpreis) × (Vergrößerung) ist, auf die nächste ganze Zahl aufgerundet. Es besteht die Möglichkeit, dass dies der Fall ist. Die Vergrößerung wird basierend auf einer Zufallszahl vom Typ uint32_t bestimmt (nimmt einen ganzzahligen Wert von $ 0 $ bis $ 2 ^ {32} $ an). Je größer der Zufallswert ist, desto größer ist die Vergrößerung. Daher wird die Wahrscheinlichkeit, die Bedingung B zu erfüllen, erhalten, indem die Grenze der Zufallszahl vom Typ uint32_t, deren Spitzenpreis 660 Glocken beträgt, unter Verwendung einer Dichotomie untersucht wird.

#include <bits/stdc++.h>
using namespace std;

// uint32_Eine Funktion, die eine Gleitkommazahl basierend auf einer Zufallszahl vom Typ t zurückgibt. Je größer die Zufallszahl, desto näher an b.
float randfloat(float a, float b, uint32_t u32)
  {
    uint32_t val = 0x3F800000 | (u32 >> 9);
    float fval = *(float *)(&val);
    return a + ((fval - 1.0f) * (b - a));
  }

//Funktion zum Aufrunden nach dem Dezimalpunkt
int intceil(float val)
  {
    return (int)(val + 0.99999f);
  }

int main() {
  uint32_t ll = 0;  //uint32_Untergrenze von t
  uint32_t rr = pow(2, 32) - 1;  //uint32_Obergrenze von t
  int32_t basePrice = 110;  //Kaufpreis
  uint64_t l, r, m;
  int32_t peakPrice;

  l = 0;
  r = pow(2, 32) - 1;
  m = (l + r) / 2;

  //Halbierungssuche
  while (r - l > 1) {
    peakPrice = intceil(randfloat(2.0, 6.0, m) * basePrice);  //Spitzenpreis
    if (peakPrice < 660) {l = m;}
    else {r = m;}
    m = (l + r) / 2;
  }

  cout << 0 << "Von" << rr << "Die Zufallszahl, die den Wert von annimmt" << m << "Wenn es größer ist, ist es der höchste Wert." << endl;
  cout << "Die Wahrscheinlichkeit ist" << (double)(rr - m) / (double)(rr) << "Ist." << endl;
}

Ausgabe

Wenn die Zufallszahl von 0 bis 4294967295 größer als 4285206015 ist, ist dies der höchste Wert.
Die Wahrscheinlichkeit ist 0.Es ist 00227273.

Das Multiplizieren aller berechneten Wahrscheinlichkeiten ergibt $ 0,2474 \ times \ frac {1} {21} \ times 0,002272 = 2,68 \ times 10 ^ {-5} $. Obwohl die Wahrscheinlichkeit von 0,00268% </ b> gering ist, beträgt die Anzahl der verkauften Spiele ab dem 7. Mai 2020 . 200507_3.pdf "> 11,77 Millionen Flaschen Selbst wenn 1% von ihnen den Jungtierpreis überprüfen, überprüfen ungefähr 3 Menschen auf der ganzen Welt den höchsten Preis von 660 Glocken pro Woche. Es wird die Berechnung, die durchgeführt wird.

Als nächstes berechnen wir die Wahrscheinlichkeit des niedrigsten Preises.

Wahrscheinlichkeit des niedrigsten Preises (9 Glocken)

Um den niedrigsten Preis (9 Glocken) zu erreichen, sind zusätzlich zu "4. Bounce small size" (Wahrscheinlichkeit 0,2588) die folgenden Bedingungen erforderlich.

A: Der Kaufpreis der Insel (der Preis, den Sie am Sonntagmorgen bei Uri kaufen können) beträgt 90-110 Glocken, was 90 Glocken entspricht. </ b> B: Von den acht "Zeit, zum ersten Mal zu wachsen" {Montagmorgen, Montagnachmittag, ..., Donnerstagnachmittag}, Montagmorgen oder Donnerstagnachmittag. </ b>

  • In B ist die Wahrscheinlichkeit für Montagmorgen und Donnerstagnachmittag gleich, und die Programme sind fast gleich, sodass die Bedingungen für C und D unten für Donnerstagnachmittag erläutert werden. </ b> C: Unter diesen Bedingungen könnte der Jungtierpreis am Montagmorgen 36-81 Glocken betragen, was 36 Glocken entspricht. </ b> D: Unter diesen Bedingungen könnte der Jungtierpreis am Donnerstagnachmittag 9-65 Glocken betragen, was 9 Glocken entspricht. </ b>

Da A und B durch Zufallszahlen ausgewählt werden, sind die Wahrscheinlichkeiten $ \ frac {1} {21} bzw. \ frac {1} {4} $. Generieren Sie für C zunächst einen Float-Wert von 0,4 bis 0,9 als Multiplikator und multiplizieren Sie ihn mit 90 Glocken des Kaufpreises, um den Cub-Preis am Montagmorgen zu erhalten. Da die Brüche unter dem Dezimalpunkt aufgerundet sind, muss die Vergrößerung 0,4 betragen (es ist kein Problem, wenn sie aufgrund des Fehlers etwas höher ist), um 36 Glocken zu erreichen. Wie oben erwähnt, wird die Vergrößerung basierend auf der Zufallszahl vom Typ uint32_t bestimmt (nimmt einen ganzzahligen Wert von $ 0 $ bis $ 2 ^ {32} $ an), aber hier ist die Vergrößerung umso größer, je kleiner der Zufallswert ist. (Codezeile 317). Schließlich scheint es gut, die Wahrscheinlichkeit zu finden, dass die Bedingung C erfüllt ist, indem die Grenze einer Zufallszahl mit einem Jungtierwert von 36 Glocken unter Verwendung einer Dichotomie untersucht wird.

#include <bits/stdc++.h>
using namespace std;

// uint32_Eine Funktion, die eine Gleitkommazahl basierend auf einer Zufallszahl vom Typ t zurückgibt. Je größer die Zufallszahl, desto näher an b.
float randfloat(float a, float b, uint32_t u32)
  {
    uint32_t val = 0x3F800000 | (u32 >> 9);
    float fval = *(float *)(&val);
    return a + ((fval - 1.0f) * (b - a));
  }

//Funktion zum Aufrunden nach dem Dezimalpunkt
int intceil(float val)
  {
    return (int)(val + 0.99999f);
  }

int main() {
  uint32_t ll = 0;  //uint32_Untergrenze von t
  uint32_t rr = pow(2, 32) - 1;  //uint32_Obergrenze von t
  int32_t basePrice = 90;  //Kaufpreis
  uint64_t l, r, m;
  int32_t monAmPrice;

  l = 0;
  r = pow(2, 32) - 1;
  m = (l + r) / 2;
  
  //Halbierungssuche
  while (r - l > 1) {
    monAmPrice = intceil(randfloat(0.9, 0.4, m) * basePrice);  //Montagmorgen Preis
    if (monAmPrice > 36) {l = m;}
    else {r = m;}
    m = (l + r) / 2;
  }

  cout << ll << "Von" << rr << "Die Zufallszahl, die den Wert von annimmt" << m << "Wenn größer als, ist die Bedingung C erfüllt." << endl;
  cout << "Die Wahrscheinlichkeit ist" << (double)(rr - m) / (double)(rr) << "Ist." << endl;
}

Ausgabe

Bedingung C ist erfüllt, wenn die Zufallszahl von 0 bis 4294967295 größer als 4294966783 ist.
Die Wahrscheinlichkeit ist 1.19209e-07.

Aufgrund der Art der Aufrundung nach dem Dezimalpunkt ist die Wahrscheinlichkeit dieses Mal signifikant geringer als die Bedingung B beim höchsten Wert.

Betrachten Sie schließlich die Wahrscheinlichkeit, die Bedingung zu erfüllen: "D: Der Jungtierpreis am Donnerstagnachmittag kann 9-65 Glocken betragen, was 9 Glocken entspricht." Das Verhältnis von 0,4 ab Montagmorgen nimmt in den sechs Zeiträumen von Montagnachmittag bis Donnerstagnachmittag monoton ab. Zu diesem Zeitpunkt wird in jeder Periode das Ausmaß der Abnahme der Vergrößerung von 0,03 bis 0,05 bestimmt und aktualisiert. Damit 90 Glocken zu 9 Glocken werden, muss das Verhältnis 0,1 $ = 0,4-0,05 mal 6 $ betragen, und wir werden den Fall betrachten, in dem die Abnahmerate für 6 aufeinanderfolgende Perioden fast das Maximum (0,05) ist. Wenn Sie jedoch den Cub-Wert nach dem Dezimalpunkt aufrunden, wird der Vorgang "Hinzufügen von 0,9999 und anschließendes Abschneiden des Bruchs" ausgeführt. So wird beispielsweise die 9.001-Glocke auf 10 Glocken aufgerundet, die 9.0000001-Glocke jedoch zu 9 Glocken. Machen. Daher ist es möglich, dass die Abnahmerate nicht für alle sechs Male der Maximalwert sein muss. Trotzdem wurde unter Bedingung C der Schwellenwert der Zufallszahl durch Durchführen einer Dichotomie erhalten, aber dies war möglich, weil die Zufallszahl nur einmal erzeugt wurde und diesmal 6 Zufallszahlen so einfach beteiligt sind Kann nicht. Daher wird die Wahrscheinlichkeit nach der folgenden Methode berechnet.

D-1. Sei $ A $ der Betrag der Abnahme der Vergrößerung (am nächsten an 0,03 (Anmerkung)), wenn die Zufallszahl der höchste Wert von $ 2 ^ {32} -1 $ ist. Unter der Bedingung, dass der Rückgang von 5 von 6 $ $ A $ beträgt, wird der Schwellenwert für die Anzahl oder mehr der verbleibenden 1 Abnahme von 9 Glocken berechnet. Der Schwellenwert sei $ B $. D-2. Für den Betrag der Abnahme von $ B $ auf $ A $ ist der Bereich der Zufallszahl der Betrag der Abnahme. D-3. Durchsuchen Sie jeden der 6 Tropfen zwischen $ B $ und $ A $ und für diejenigen mit 9 Glocken die Anzahl solcher Fälle (multiplizieren Sie die mit D-2 berechnete Breite mit 6). Zusammen addieren). D-4. Der Wert geteilt durch $ (2 ^ {32}) ^ 6 $ ist die Wahrscheinlichkeit, die Bedingung D zu erfüllen.

(Anmerkung) Der Grund, warum es 0,03 anstelle von 0,05 ist, ist, dass die Operation "0,02 subtrahieren und dann 0 bis 0,03 subtrahieren" in der Analyse ausgeführt wird, und daraus folgt.

Was das Ausmaß der Abnahme betrifft, ist es einfacher, mit dem unzulässigen Teil des Float-Typs umzugehen, als den Dezimalteil in Dezimalzahl anzuzeigen, sodass er als solcher geschrieben wird. Ich habe auf den folgenden Artikel verwiesen, um die hexadezimale Darstellung des falschen Teils zu erhalten. https://qiita.com/nia_tn1012/items/d26f0fc993895a09b30b Außerdem wird der Wert der Zufallszahl, der zuvor in Dezimalzahl ausgedrückt wurde, jetzt in Hexadezimalzahl ausgedrückt.

Führen Sie zunächst D-1 durch Dichotomie durch.

#include <bits/stdc++.h>
using namespace std;

// uint32_Eine Funktion, die eine Gleitkommazahl basierend auf einer Zufallszahl vom Typ t zurückgibt. Je größer die Zufallszahl, desto näher an b.
float randfloat(float a, float b, uint32_t u32)
  {
    uint32_t val = 0x3F800000 | (u32 >> 9);
    float fval = *(float *)(&val);
    return a + ((fval - 1.0f) * (b - a));
  }

//Funktion zum Aufrunden nach dem Dezimalpunkt
int intceil(float val)
  {
    return (int)(val + 0.99999f);
  }

//Eine Funktion, die den formalen Teil des Float-Typs zurückgibt
int printb(float ff) {
    union { float f; int i; } a;
    int i;
    a.f = ff;

    return a.i & 0x7FFFFF;
  }

int main() {
  uint32_t ll = 0;  //uint32_Untergrenze von t
  uint32_t rr = pow(2, 32) - 1;  //uint32_Obergrenze von t
  int32_t basePrice = 90;  //Kaufpreis
  uint64_t l, r, m;

  float declineRate;
  int32_t thuPmPrice;
  l = 0;
  r = pow(2, 32) - 1;
  m = (l + r) / 2;

  //Halbierungssuche
  while (r - l > 1) {
    declineRate = (0.4 - 0.03 * 6 - randfloat(0, 0.02, rr) * 5 - randfloat(0, 0.02, m));
    thuPmPrice = intceil(declineRate * basePrice);  //Preis am Donnerstagnachmittag
    if (thuPmPrice > 9) {l = m;}
    else {r = m;}
    m = (l + r) / 2;
  }
  cout << hex << "Der falsche Teil der Fallbreite B ist" << printb(randfloat(0, 0.02, m+1)) \
  << "Und der Wert der kleinsten Zufallszahl im Bereich der Abnahme ist" << m+1 << "Ist." << endl;
  cout << hex << "Der falsche Teil der Fallbreite A ist" << printb(randfloat(0, 0.02, rr)) << "Ist." << endl;
}

Ausgabe

Der formale Teil der Fallbreite B ist 23d6db, und der kleinste Zufallswert in der Fallbreite ist ffffb600.
Der falsche Teil der Fallbreite A ist 23d709.

Daher können Sie nach 23d6db bis 23d709 suchen, aber für alle Fälle sollten Sie 48 Möglichkeiten von 23d6da bis 23d709 prüfen. (Abhängig von der Berechnungsreihenfolge kann der formale Teil aufgrund eines Rundungsfehlers auch bei einem Abfall von 23d6da auf 9 Glocken fallen.)

Als nächstes wurden D-2 bis D-4 sofort durchgeführt. Die Berechnungszeit betrug ca. 10 Minuten.

#include <bits/stdc++.h>
using namespace std;

// uint32_Eine Funktion, die eine Gleitkommazahl basierend auf einer Zufallszahl vom Typ t zurückgibt. Je größer die Zufallszahl, desto näher an b.
float randfloat(float a, float b, uint32_t u32)
  {
    uint32_t val = 0x3F800000 | (u32 >> 9);
    float fval = *(float *)(&val);
    return a + ((fval - 1.0f) * (b - a));
  }

//Funktion zum Aufrunden nach dem Dezimalpunkt
int intceil(float val)
  {
    return (int)(val + 0.99999f);
  }

//Eine Funktion, die den formalen Teil des Float-Typs zurückgibt
int printb(float ff) {
    union { float f; int i; } a;
    int i;
    a.f = ff;
    return a.i & 0x7FFFFF;
  }

//Eine rekursive Funktion, die alle Arten sucht, in denen die Vergrößerung abnimmt
int64_t fullSearch(float declineRateNow, int step, int basePrice, vector<float> declineRates, int c) {
  int64_t ans = 0;
  int32_t thuPmPrice;
  if (step == 6) {
    thuPmPrice = intceil(declineRateNow * basePrice); //Überprüfen Sie, ob der Preis am Donnerstagnachmittag 9 Glocken beträgt
    if (thuPmPrice == 9) {return 1;}
    else {return 0;}
  }
  else {
    declineRateNow -= 0.03;
    for (int i=0; i<c; i++) {
      ans += fullSearch(declineRateNow - declineRates.at(i), step + 1, basePrice, declineRates, c);
    }
  }
  return ans;
}

int main() {
  uint32_t m = pow(2, 32) - 1;
  float declineRate = randfloat(0, 0.02, m);
  float declineRate_b = randfloat(0, 0.02, m);
  uint32_t l, r;
  int c = 0;
  vector<float> declineRates(50);
  
  // D-2
  r = m;
  cout << "No. |Zufällige Untergrenze|Zufällige Obergrenze|Breite|Falscher Teil des Rückgangs" << endl;
  while (true) {
    declineRate_b = declineRate;
    declineRate = randfloat(0, 0.02, m);
    if (printb(declineRate) < printb(declineRate_b)) {
      l = m + 1;
      cout << hex << setfill('0') << setw(2) << c << " | " << l << " | " << r << " | " \
      << r-l+1 << " | " << printb(declineRate_b) << endl;
      declineRates.at(c) = declineRate_b;
      r = m;
      c++;
      if (printb(declineRate) < 0x23d6da) {break;}
    }
    m--;
  }

  // D-3
  int32_t basePrice = 90;
  int64_t count9bell = fullSearch(0.4, 0, basePrice, declineRates, c);

  // D-4
  // (2^9)^Nach dem Multiplizieren mit 6(2^32)^23 durch 2 statt durch 6 zu teilen*6 mal geteilt
  double prob_d = count9bell;
  for (int i=0; i<23*6; i++) {
    prob_d /= 2;
  }
  cout << dec << "37^Von den 6 Möglichkeiten, die Vergrößerung zu verringern, die mit einem Jungtierpreis von 9 Glocken" << count9bell << "Es ist eine Straße." << endl;
  cout << "In diesem Fall ist die Bedingung D erfüllt und die Wahrscheinlichkeit ist" << prob_d << "Ist." << endl;
}

Zuerst berechneten wir als D-2 den Bereich des Sturzes, in dem der zufällige Teil 23d6da bis 23d709 ist, was 48 Wege ist, und den Bereich des Sturzes. Die folgende Ausgabe wurde erhalten.

No. |Zufällige Untergrenze|Zufällige Obergrenze|Breite|Falscher Teil des Rückgangs
00 | fffffe00 | ffffffff | 200 | 23d709
01 | fffffc00 | fffffdff | 200 | 23d707
02 | fffffa00 | fffffbff | 200 | 23d706
03 | fffff800 | fffff9ff | 200 | 23d705
04 | fffff600 | fffff7ff | 200 | 23d704
05 | fffff400 | fffff5ff | 200 | 23d702
06 | fffff200 | fffff3ff | 200 | 23d701
07 | fffff000 | fffff1ff | 200 | 23d700
08 | ffffee00 | ffffefff | 200 | 23d6fe
09 | ffffec00 | ffffedff | 200 | 23d6fd
0a | ffffea00 | ffffebff | 200 | 23d6fc
0b | ffffe800 | ffffe9ff | 200 | 23d6fb
0c | ffffe600 | ffffe7ff | 200 | 23d6f9
0d | ffffe400 | ffffe5ff | 200 | 23d6f8
0e | ffffe200 | ffffe3ff | 200 | 23d6f7
0f | ffffe000 | ffffe1ff | 200 | 23d6f6
10 | ffffde00 | ffffdfff | 200 | 23d6f4
11 | ffffdc00 | ffffddff | 200 | 23d6f3
12 | ffffda00 | ffffdbff | 200 | 23d6f2
13 | ffffd800 | ffffd9ff | 200 | 23d6f0
14 | ffffd600 | ffffd7ff | 200 | 23d6ef
15 | ffffd400 | ffffd5ff | 200 | 23d6ee
16 | ffffd200 | ffffd3ff | 200 | 23d6ed
17 | ffffd000 | ffffd1ff | 200 | 23d6eb
18 | ffffce00 | ffffcfff | 200 | 23d6ea
19 | ffffcc00 | ffffcdff | 200 | 23d6e9
1a | ffffca00 | ffffcbff | 200 | 23d6e7
1b | ffffc800 | ffffc9ff | 200 | 23d6e6
1c | ffffc600 | ffffc7ff | 200 | 23d6e5
1d | ffffc400 | ffffc5ff | 200 | 23d6e4
1e | ffffc200 | ffffc3ff | 200 | 23d6e2
1f | ffffc000 | ffffc1ff | 200 | 23d6e1
20 | ffffbe00 | ffffbfff | 200 | 23d6e0
21 | ffffbc00 | ffffbdff | 200 | 23d6de
22 | ffffba00 | ffffbbff | 200 | 23d6dd
23 | ffffb800 | ffffb9ff | 200 | 23d6dc
24 | ffffb600 | ffffb7ff | 200 | 23d6db

Alle Zahlen in der Tabelle sind hexadezimal. Wenn Sie beispielsweise in der letzten Zeile 0x200-Werte von ffffb600 bis ffffb7ff (Zufallszahlen mit Werten von 00000000 bis ffffffff) verwenden, beträgt der falsche Teil des Rückgangs 23d6db. Aus dieser Tabelle können wir Folgendes sehen.

  • Unabhängig vom Wert der Zufallszahl ist der Betrag der Abnahme nicht der unangemessene Teil wie 23d708, 23d703, .... (Obwohl wir 48 Möglichkeiten untersucht haben, beträgt die Anzahl der Zeilen in der Tabelle 0x25, dh 37 Zeilen, sodass wir sehen können, dass es 11 solcher Rückgänge gibt.)
  • Für alle möglichen Rückgänge beträgt die Breite des Zufallsbereichs 0x200, dh $ 2 ^ 9 = 512 $. (Tatsächlich ist dies aus dem Code der Randfloat-Funktion ersichtlich.)

Daher haben wir für D-3 und D-4 alle 6 Zeiten des Rückgangs auf diese 37 Arten durchsucht und gezählt, wie oft der Jungtierpreis im $ 37 ^ 6 $ -Muster des Rückgangs zu 9 Glocken wurde und wie oft. Multipliziert mit $ (2 ^ 9) ^ 6 $ und dividiert durch $ (2 ^ {32}) ^ 6 $ ergibt die Bedingung "D: Der Preis für das Jungtier am Donnerstagnachmittag kann 9-65 Glocken betragen". Dies sind jedoch 9 Glocken. " Als Ergebnis dieser Berechnung wurde die folgende Ausgabe erhalten.

37^Von den sechs "wie man die Vergrößerung verringert" haben 8689156 einen Jungtierpreis von 9 Glocken.
In diesem Fall ist die Bedingung D erfüllt und die Wahrscheinlichkeit ist 2.49367e-Es ist 035.

Multiplikation der Wahrscheinlichkeit eines Fluktuationsmusters (kleiner Sprung) und der Wahrscheinlichkeit der Bedingungen A bis D, $ 0.2588 \ times \ frac {1} {21} \ times \ frac {1} {4} \ times (1.192 \ times 10 ^ {-7}) \ times (2.494 \ times 10 ^ {-35}) = 9.16 \ mal 10 ^ {-45} $. Dies ist eine astronomisch niedrige Wahrscheinlichkeit. Selbst wenn alle 7,7 Milliarden Menschen auf der Erde dieses Spiel haben und jede Woche den Jungtierpreis von der Geburt des Universums vor 13,8 Milliarden Jahren bis heute überprüfen, werden sie sogar einmal "1 Jungtier 9 Glocke" sehen. Die Wahrscheinlichkeit, dass dies getan wird, beträgt $ 5,08 \ mal 10 ^ {-23} $. </ b> Es ist zu beachten, dass dies die Wahrscheinlichkeit ist, wenn der Quellcode des Analyseergebnisses des in "Prämisse" beschriebenen Algorithmus zur Bestimmung des Cub-Werts vollständig mit dem im Spiel übereinstimmt. Wenn der Mehrwert der intceil-Funktion, die nach dem Dezimalpunkt aufgerundet wird, 0,999999 statt 0,99999 beträgt, ist die Wahrscheinlichkeit des niedrigsten Preises geringer, und selbst wenn der Float-Typ vom Doppeltyp ist, ändert sich die Wahrscheinlichkeit.

Zusammenfassung

  • Die Wahrscheinlichkeit, dass der Jungtierpreis den höchsten Wert von 660 Glocken erreicht, beträgt 2,68 $ mal 10 ^ {-5} $, und man kann sagen, dass er jede Woche irgendwo auf der Welt erscheint.
  • Die Wahrscheinlichkeit, dass der Jungtierpreis die niedrigsten 9 Glocken sein wird, beträgt 9,16 $ mal 10 ^ {-45} $, was unwahrscheinlich ist.

Referenz

Atsumare Animal Forest Cub Preisvorhersage-Tool | hyperWiki Wenn Sie den Kauf- oder Verkaufspreis des Jungtiers eingeben, werden der vorhergesagte Wert des Jungtierpreises und die Wahrscheinlichkeit angezeigt, dass sich der Jungtierpreis in jedem Schwankungsmuster befindet.

AtCoder-Codetest Code-Testseite der Wettbewerbsprogrammierungsseite AtCoder. Selbst wenn Japanisch für die Standardausgabe von C ++ verwendet wird, wird es ohne verstümmelte Zeichen ausgegeben.

Änderungsprotokoll

  • 2020/07/14 Die Wahrscheinlichkeit des niedrigsten Preises wurde korrigiert, typografische Fehler korrigiert (falsch: Abnahmerate → richtig: Abnahmeweite)

Recommended Posts