2016-07-02 11 views
1

私はこのコードを実行しようとすると、10から19の数字も返されますが、20から30の範囲で戻り値を返します。パターンは%min + rangeですが、%50 + 50回バックナンバーは50〜99ですが、それ以外の最小値は機能しません。どうして?なぜrand()%20 + 10は10代をC++で返すのですか?

#include<iostream> 
#include<cstdlib> 
#include<ctime> 

using namespace std; 
int main() 
{ 
    srand(time(0)); 
    for(int i=1; i<100; i++) 
    { 
     cout<<rand()%20+10<<endl; 
    } 
    return 0; 
} 
+0

試してみてください 'rand()%10 + 20' – harper

+0

これはあなたの質問には答えませんが、[this](https://stackoverflow.com/questions/10984974/why-do-people-say-there-あなたの乱数分布が心配な場合は、乱数生成器を使用するときはモジューロバイアスです。 – mkal

答えて

3

これは、あなたが後方にいるからです。 %range + minです。モジュラス関数は除算の残りの部分を返します。
乱数mod 20を実行するとします。その結果は0から19までの範囲になります。私もmodulusに数numを追加すると、
0 + numから19 + num

+0

ありがとうございました。これはとても役に立ちました! – user1030

2

モジュラス演算子%は、数値で除算すると剰余を得ます。この場合、rand()%20は0から19までの値を返します。これに10を加えると、10と29の間の値が与えられます。

数値が20〜30の場合は、rand()%10を入力すると1〜9の数値が与えられ、20を加算して20〜29の数値を得ることができます。

要約:rand() % 10 + 20は、[20,30)の数値を返します。

+1

範囲と分がどこに行くのかを記憶するよりも原則を教える方が良いので、私はこの答えに投票しました... – Assimilater

+0

ありがとうございました!私もいくつかの数学的なマーキングを学んだ:) – user1030

1
#include<iostream> 
#include<cstdlib> 
#include<ctime> 

using namespace std; 
int main(){ 
    srand(time(NULL)); 
    for(int i=0; i<100; i++) 
     cout<<rand()%11+20<<endl; 
    return 0; 
} 

上記のコードは、20と30の間の100のランダムな値を生成するためのものです。求めているパターンは、代わりに%range + minです。 %50 + 50の場合、ここではrange = min = 50であるため、正解を返します。

関連する問題