random

ソースコード

from titan_pylib.algorithm.random.random import Random

view on github

展開済みコード

 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]

仕様

class Random[source]

Bases: object

乱数系のライブラリです。 標準ライブラリよりも高速なつもりでいます。

randint(begin: int, end: int) int[source]

begin 以上 end 以下 のランダムな整数を返します。 \(O(1)\) です。

制約:

\(begin \leq end\)

random() float[source]

0以上1以下の一様ランダムな値を1つ生成して返すはずです。 \(O(1)\) です。

randrange(begin: int, end: int) int[source]

begin 以上 end 未満 のランダムな整数を返します。 \(O(1)\) です。

制約:

\(begin < end\)

shuffle(a: list[Any]) None[source]

a をインプレースにシャッフルします。 \(O(n)\) です。

Parameters:

a (list[Any]) – a をシャッフルします。