【问题标题】:Double-precision Random number array双精度随机数数组
【发布时间】:2016-08-27 00:20:42
【问题描述】:

做了一些作业来编写一个程序,该程序可以加载和显示数组大小为 20 的双精度随机数。 我知道它很乱但不擅长这个

#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;
    }
}

需要在 4x5 表格中显示 错误是数组下标的'无效类型'double * [double]'

【问题讨论】:

    标签: c++ arrays random precision


    【解决方案1】:

    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 &lt;&lt; arr[i-1]; 或在 (0-19) 范围内使用循环并将条件更改为 if((i + 1) % cols == 0) ...


    如果你必须使用rand()来生成这些数字,你可以使用:

    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::srand 与变量(可能是 std::time(0))一起使用,以便在多次执行同一二进制文件时获得不同的输出。

    【讨论】:

      【解决方案2】:
      for (double i = 1; i <21; i++)
      {
          dArr[i] = static_cast<double>(rand()%100)/10;
      

      您不能访问带有双精度的数组(即 dArr[i] 无效,因为 i 不是整数类型 - 它是双精度浮点值),必须是整数类型。只需将 i 设为 int 即可。

      也就是说,从 1-20 而不是 0-19 的循环将起作用(因为您使数组 1 元素太大),但您不应该这样做。习惯写作

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

      然后只分配正确大小的数组(在您的示例中,20 而不是 21)

      【讨论】:

      • 采纳了您的建议,现在可以编译,这很好,但是十进制数组的范围是 .1-1.0 而不是 1.00-100.00 有什么想法吗?
      • 从头开始,想通了,但我的双精度不起作用
      • 这很奇怪。我希望dArr[i] = static_cast&lt;double&gt;(rand()%100)/10; 给出值 0 - 9.9 - 你的双精度值将是 0 - 99 整数的双精度表示,然后你将它除以 10 - 所以 0-9.9。人们经常做的是将 rand() 转换为加倍,将其除以 RAND_MAX,然后将该结果(确保以正确的顺序执行,否则会溢出)乘以所需的最大范围。所以你得到一个在 0-1 范围内平均分布的双倍,然后乘以 100 或任何最大值。
      • dArr[i] = rand()%100 + static_cast&lt;double&gt;(rand()%100)/100; 我这里有些地方出错了,我需要该值是双精度并且在 1.00-100.00 之间
      • 这会给你一个非常奇怪的分布——而且它不是随机的。这是整个“掷两个骰子并添加它们”的分布,除了一个骰子的值比另一个大 100 倍。
      猜你喜欢
      • 1970-01-01
      • 2018-11-27
      • 2011-02-11
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 2013-08-10
      • 2011-07-07
      • 2023-03-19
      相关资源
      最近更新 更多