likeではなくrandom.randint(a, b)
、範囲内の整数を返すことは、私には常に奇妙に思えました。[a, b]
[a, b-1]
range(...)
この明らかな矛盾には何らかの理由がありますか?
いくつかの古い情報源を調べて、この問題の根底に到達しようとしました。これは Python の long integer よりも前に実装されたのではないかと考えrandint
ました。 つまり、 を含む乱数INT_MAX
が必要な場合は、 which を呼び出す必要がrandom.randrange(0, INT_MAX + 1)
あり、オーバーフローして引数が(0, 0)
or(0, INT_MIN)
に依存することになります。
ただし、Python 1.5.2 のソースまでさかのぼって見ると、次のようになりLib/whrandom.py
ます。
#
# Get a random integer in the range [a, b] including both end points.
# (Deprecated; use randrange below.)
#
def randint(self, a, b):
return self.randrange(a, b+1)
whrandom.randint
2.0、2.1、2.2、および2.3で廃止され続けました。2.1random.randint
では非推奨としてマークされていましたが、 2.2では非推奨としてマークされなくなりました。
また、random.py
バージョン 2.1 からrandom.randint
、の docstringで最初に注目するのは次のとおりです。
def randrange(self, start, stop=None, step=1, int=int, default=None):
"""Choose a random item from range(start, stop[, step]).
This fixes the problem with randint() which includes the
endpoint; in Python this is usually not what you want.
Do not supply the 'int' and 'default' arguments.
"""
それより古い唯一の利用可能なソースは 0.9.1 sourceであり、私が知る限り、randint
その時点では実装されていませんでした。
randint
したがって、エンドポイントを含める理由は、現時点では Guido 自身のみが知っていると結論付けます。Python 2.1 の docstring を考えると、その理由は単純な間違いだったように思えます。
random.randint
この機能を実装する最初の試みだったと思います。Python 開発者もこれが問題だと感じていたようです。そのため、v1.5.2では、より標準的なパラメータを持つ別のメソッドrandrangeを追加しました。
random.randrange([start], stop[, step])
範囲 (開始、停止、ステップ) からランダムに選択された要素を返します。これは Choice(range(start, stop, step)) と同等ですが、実際には range オブジェクトを構築しません。
意外な人を避けるrandrange
代わりに使えます。randint
一方、問題が「1 から 6 の間の乱数を選択する」と表現される多くの状況では、またはrandint(1, 6)
と書く代わりに使用する方が自然かもしれません。randrange(1, 7)
randrange(min, max + 1)
これは憶測ですが、「a から b までの乱数をください」の通常の人間の使用法は包括的です。より人間が読める言語であるという Python の一般的な哲学を考えると、そのように実装することは理にかなっています。
その理由はないと思います。しかし、少なくとも文書化されています。