random¶
ソースコード¶
from titan_pylib.algorithm.random.random import Random
展開済みコード¶
1# from titan_pylib.algorithm.random.random import Random
2from typing import Any
3
4
5class Random:
6 """Random
7 乱数系のライブラリです。
8 標準ライブラリよりも高速なつもりでいます。
9 """
10
11 def __init__(self) -> None:
12 self._x = 123456789
13 self._y = 362436069
14 self._z = 521288629
15 self._w = 88675123
16
17 def _xor(self) -> int:
18 t = (self._x ^ ((self._x << 11) & 0xFFFFFFFF)) & 0xFFFFFFFF
19 self._x, self._y, self._z = self._y, self._z, self._w
20 self._w = (self._w ^ (self._w >> 19)) ^ (
21 t ^ ((t >> 8)) & 0xFFFFFFFF
22 ) & 0xFFFFFFFF
23 return self._w
24
25 def random(self) -> float:
26 """0以上1以下の一様ランダムな値を1つ生成して返すはずです。
27 :math:`O(1)` です。
28 """
29 return self._xor() / 0xFFFFFFFF
30
31 def randint(self, begin: int, end: int) -> int:
32 """``begin`` 以上 ``end`` **以下** のランダムな整数を返します。
33 :math:`O(1)` です。
34
35 制約:
36 :math:`begin \\leq end`
37 """
38 assert begin <= end
39 return begin + self._xor() % (end - begin + 1)
40
41 def randrange(self, begin: int, end: int) -> int:
42 """``begin`` 以上 ``end`` **未満** のランダムな整数を返します。
43 :math:`O(1)` です。
44
45 制約:
46 :math:`begin < end`
47 """
48 assert begin < end
49 return begin + self._xor() % (end - begin)
50
51 def shuffle(self, a: list[Any]) -> None:
52 """``a`` をインプレースにシャッフルします。
53 :math:`O(n)` です。
54
55 Args:
56 a (list[Any]): ``a`` をシャッフルします。
57 """
58 n = len(a)
59 for i in range(n - 1):
60 j = self.randrange(i, n)
61 a[i], a[j] = a[j], a[i]