2016-05-02 32 views
3

は、私はこの倍精度乱数列

#include <iostream> //required for cin, cout, endl 
#include <cstdlib> //required for setw(), setfill() 
#include <iomanip> 

using namespace std; 


void printArray(int arr[]); 
void fillRandArray(int arr[]); 
void fillDecimalArray(double dArr[]); 
void printDecimalArray (double dArr[]); 

int main() 
{ 

    int random[21]; 
    double decimal[21]; 
    rand(); 

    fillRandArray(random); 
    fillDecimalArray(decimal); 
    printArray(random); 
    printDecimalArray(decimal); 


    cin.get(); 
    cin.get(); 
    return 0; 
} 

void fillRandArray(int arr[]) 
{ 
    for (int i = 1; i < 21; i++) 
    { 
     arr[i] = rand() % 100 + 1; 
    } 

}//end load of rand array 

void fillDecimalArray(double dArr[ ]) 
{ 
    for (double i = 1; i <21; i++) 
    { 
     dArr[i] = static_cast<double>(rand()%100)/10; 
    } 
} 

void printArray(int arr[]) 
{ 
    cout << "   5x4 Array" <<endl; 
    cout <<endl; 

    int cols = 5; 

    for(int i = 1; i < 21; i++) 
    { 
     cout << setw(5) << setfill(' '); 
     cout << arr[i]; 
     if(i%cols == 0) 
      cout << endl; 
    }//end print array 

}//end of printArray() 

void printDecimalArray (double dArr[]) 
{ 
    int cols = 4; 

    for (double i = 1; i <21; i++) 
    { 
     cout << setw(5) << setfill(' '); 
     int precision = 2; 
     cout << dArr[i]; 
     cout << endl; 
    } 
} 

で良いにその厄介ではなく、を知っている負荷および20 のアレイサイズと倍精度の乱数を表示するプログラムを作成するためにいくつかの宿題を得ました エラーがある4×5の表に表示される必要がある「無効な種類の 『ダブル* [ダブル]

答えて

1
for (double i = 1; i <21; i++) 
{ 
    dArr[i] = static_cast<double>(rand()%100)/10; 

あなたが持つ配列にアクセスすることはできません』配列の添字のための」ダブル(私ではないので、つまりdArr[i]が無効です整数型 - 倍精度浮動小数点値)、整数型でなければなりません。ちょうど私をintにして、あなたはいいよ。

つまり、配列1の要素が大きすぎるので、0-19ではなく1から20のループが機能しますが、実行しないでください。 (20ではなく21で、ここではあなたの例では)

for (int i = 0; i < size_of_array; i++) 

を書き込み、そしてちょうど正しいサイズの配列を割り当てるに慣れる

+0

あなたのアドバイスを取ったところ、これはすばらしいですが、10進数の配列の範囲は.1-1.0 intied = 1.00-100.00 です。 –

+0

傷は、それを考え出しましたが、私の倍精度は動作していません –

+0

それは変です。私は 'dArr [i] = static_cast (rand()%100)/ 10;' 0〜9.9の値を与えることを期待しています - doubleの値は0〜99の整数の二重表現になりますあなたはそれを10で割ります - だから0-9.9です。人々がしばしば行うことは、doubleをキャストすることです。RAND_MAXで除算し、その結果を乗算します(正しい順序で実行するか、オーバーフローするかを確認してください)。だから0から1の範囲で均等に分布した二倍を得てから、それを100倍にするか、それとも最大値にするかを掛けます。 – xaxxon

4

以降はC++ 11は、使用することができますstd::uniform_real_distribution

#include <random> 
... 
std::random_device rd; 
std::mt19937 gen(rd()); 
const double min_v = 1.0, max_v = 100.0; 
std::uniform_real_distribution<> dis(min_v, max_v); 
for (int n = 0; n < 20; ++n) { 
//   ^^^^ 
    dArr[n] = dis(gen); 
} 

Link to example

あなたが範囲(1-20)でループを使用している場合は、cout << arr[i-1];を使用しますか、範囲(0-19)でループを使用して、これらの番号を生成するrand()を使用する必要がある場合if((i + 1) % cols == 0) ...


に条件を変更し、あなたが使用することができます。

dArr[n] = 1 + (rand() % 99) + static_cast<double>(rand() % 101)/100.0; 
// Expression       Range 
// [1] rand() % 99     0 - 98 
// [2] 1 + (rand() % 99)    1 - 99 
// [3] rand() % 101     0 - 100 
// [4] (rand() % 101)/100.0   0.00 - 1.00 
// [5] [2] + [4]      1.00 - 100.0 

しかし、私たちは警告している:

  1. このような式を使用して生成された乱数の分布は一様ではありません。
  2. 同じバイナリの複数の実行で異なる出力を得るには、常に変数を使用してください(おそらくstd::time(0))。