54

likeではなくrandom.randint(a, b)、範囲内の整数を返すことは、私には常に奇妙に思えました。[a, b][a, b-1]range(...)

この明らかな矛盾には何らかの理由がありますか?

4

4 に答える 4

89

いくつかの古い情報源を調べて、この問題の根底に到達しようとしました。これは 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.randint2.02.12.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 を考えると、その理由は単純な間違いだったように思えます。

于 2010-04-02T20:08:31.093 に答える
14

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)

于 2010-04-02T19:42:36.937 に答える
9

これは憶測ですが、「a から b までの乱数をください」の通常の人間の使用法は包括的です。より人間が読める言語であるという Python の一般的な哲学を考えると、そのように実装することは理にかなっています。

于 2010-04-02T20:25:14.813 に答える
3

その理由はないと思います。しかし、少なくとも文書化されています。

于 2010-04-02T19:42:04.027 に答える