OSDN Git Service

[Refactor] #1372 AngbandWorld の乱数に関するフィールド変数をAngbandSystem へ移した
[hengbandforosx/hengbandosx.git] / src / term / z-rand.cpp
index 3695129..0c50080 100644 (file)
@@ -1,4 +1,4 @@
-/* File: z-rand.c */
+/* File: z-rand.c */
 
 /*
  * Copyright (c) 1997 Ben Harrison, and others
@@ -11,9 +11,7 @@
 /* Purpose: a simple random number generator -BEN- */
 
 #include "term/z-rand.h"
-#include "util/rng-xoshiro.h"
-#include "world/world.h"
-
+#include "system/angband-system.h"
 #include <algorithm>
 #include <cmath>
 #include <limits>
@@ -66,7 +64,7 @@ void Rand_state_init(void)
         std::generate(Rand_state.begin(), Rand_state.end(), [&dist, &rd] { return dist(rd); });
     } while (std::all_of(Rand_state.begin(), Rand_state.end(), [](auto s) { return s == 0; }));
 
-    w_ptr->rng.set_state(Rand_state);
+    AngbandSystem::get_instance().rng.set_state(Rand_state);
 }
 
 int rand_range(int a, int b)
@@ -75,7 +73,7 @@ int rand_range(int a, int b)
         return a;
     }
     std::uniform_int_distribution<> d(a, b);
-    return d(w_ptr->rng);
+    return d(AngbandSystem::get_instance().rng);
 }
 
 /*
@@ -83,8 +81,11 @@ int rand_range(int a, int b)
  */
 int16_t randnor(int mean, int stand)
 {
+    if (stand <= 0) {
+        return static_cast<int16_t>(mean);
+    }
     std::normal_distribution<> d(mean, stand);
-    auto result = std::round(d(w_ptr->rng));
+    auto result = std::round(d(AngbandSystem::get_instance().rng));
     return static_cast<int16_t>(result);
 }
 
@@ -94,8 +95,9 @@ int16_t randnor(int mean, int stand)
 int16_t damroll(DICE_NUMBER num, DICE_SID sides)
 {
     int i, sum = 0;
-    for (i = 0; i < num; i++)
+    for (i = 0; i < num; i++) {
         sum += randint1(sides);
+    }
     return (int16_t)(sum);
 }
 
@@ -104,7 +106,7 @@ int16_t damroll(DICE_NUMBER num, DICE_SID sides)
  */
 int16_t maxroll(DICE_NUMBER num, DICE_SID sides)
 {
-    return (num * sides);
+    return num * sides;
 }
 
 /*
@@ -116,8 +118,9 @@ int32_t div_round(int32_t n, int32_t d)
     int32_t tmp;
 
     /* Refuse to divide by zero */
-    if (!d)
-        return (n);
+    if (!d) {
+        return n;
+    }
 
     /* Division */
     tmp = n / d;
@@ -125,14 +128,15 @@ int32_t div_round(int32_t n, int32_t d)
     /* Rounding */
     if ((std::abs(n) % std::abs(d)) > randint0(std::abs(d))) {
         /* Increase the absolute value */
-        if (n * d > 0L)
+        if (n * d > 0L) {
             tmp += 1L;
-        else
+        } else {
             tmp -= 1L;
+        }
     }
 
     /* Return */
-    return (tmp);
+    return tmp;
 }
 
 /*
@@ -152,12 +156,12 @@ int32_t Rand_external(int32_t m)
 
     static std::optional<Xoshiro128StarStar> urbg_external;
 
-    if (!urbg_external.has_value()) {
+    if (!urbg_external) {
         /* Initialize with new seed */
         auto seed = static_cast<uint32_t>(time(nullptr));
         urbg_external = Xoshiro128StarStar(seed);
     }
 
     std::uniform_int_distribution<> d(0, m - 1);
-    return d(urbg_external.value());
+    return d(*urbg_external);
 }