【问题标题】:Function that generates a random number in C在 C 中生成随机数的函数
【发布时间】:2015-07-10 05:14:52
【问题描述】:

我想用 C 语言编写一个函数,它以整数 n 作为参数并生成 n^2 随机数 (1 n^2 数字存储在float *arr 中。
arr 稍后会传递给另一个函数,该函数将数组重新排列为n*n 矩阵。 例如,第一行中的第一个 n 元素,第二行中的下一个 'n' 等等。如何生成随机数,以使最终矩阵中的所有行都不相同。

当 n 像 3 一样小时,我像手动创建数组一样

float* arr;
float temp[9] = {1,1,1,1,1,1,1,1,1};
arr = temp;

我想测试更大的n 值。那我该怎么做呢?

【问题讨论】:

  • 在使用自动存储的时候,为什么要使用malloc?将temp 分配给arr 时造成了内存泄漏。
  • 是的,我不应该那样做。谢谢。
  • 你只需要使用rand(),现在不用担心重复了。

标签: c arrays matrix random


【解决方案1】:

嗯,首先,你在写的时候要明白这一点

arr = malloc(9*sizeof(float));
float temp[9] = {1,1,1,1,1,1,1,1,1};
arr = temp;

您浪费了对malloc 的调用。当你说

arr = temp;

您不是在复制数组内容,而是在重新排列指针。起初arr 指向了你用malloc 分配的区域,但后来它指向了数组temp,指向malloc 的内存的指针丢失了。 [但是你现在已经解决了这个问题,所以我们可以继续前进。]

如果你想使用像temp这样的固定数组来填充这9个值,这很容易:

int n = 3;
int arrsize = n * n;
int i;
float *arr = malloc(arrsize * sizeof(float));
for(i = 0; i < arrsize; i++) arr[i] = 1.0;

在这里,我们可以写arr[i] = 1.0这一事实非常重要。 arr 是一个指针,但我们将它视为一个数组。这就是著名的“数组和指针等价”的实际应用,如果您还不习惯,现在是学习的时候了。

你还说你想要随机数,所以我假设你并不真的想将数组的每个元素都设置为 1。这是获取随机数的快速方法 - 我选择从 1 到 10,分辨率为 0.01。

for(i = 0; i < arrsize; i++) arr[i] = 1. + rand() % 900 / 100.;

我们可以谈谈这方面的一些问题,但这是一个不错的开始。

【讨论】:

  • 这没有回答他的问题。
【解决方案2】:

您可以使用rand(void)(位于stdlib.h)。请记住使用srand() 初始化种子,例如srand(time(NULL))

void fillRow(float* row, size_t count) {
    size_t i;
    for(i = 0; i < count; ++i) {
        row[i] = (rand() % 10) + 1; /* this will generate a random number between 1 and 10 */
    }
}

【讨论】:

    【解决方案3】:

    使用rand() 函数生成随机数。

    int rand (void);
    

    你需要110 随机数所以试试这个,

    var = rand() % 10 + 1;     // var in the range 1 to 10
    

    您可以按照以下步骤操作:

    n = input
    float* arr = malloc arr to n^2 
    //initialize random seed
    srand (time(NULL));
    begin for loop (i = 0 to n^2-1)
        arr[i] = rand() % 10 + 1;
    end for
    

    请注意,伪随机数生成器是使用作为种子传递给 srand() 的参数初始化的。

    对于在调用srand 时使用的每个不同的种子值,伪随机数生成器可以预期在随后对rand 的调用中生成不同的连续结果。

    【讨论】:

      猜你喜欢
      • 2018-01-19
      • 1970-01-01
      • 1970-01-01
      • 2015-09-29
      • 2019-05-15
      • 1970-01-01
      • 2019-02-28
      相关资源
      最近更新 更多