【问题标题】:How to generate array of random float numbers using functions in C如何使用 C 中的函数生成随机浮点数数组
【发布时间】:2016-02-10 13:25:10
【问题描述】:

我已经向question 询问过一个程序。我得到了答案,但我有一个新问题。我写的程序不工作,我不知道为什么。

该函数工作正常(我猜),但我想通过打印数组中每个元素的值来确定它们是否正确(我将需要它用于其他目的)。

我尝试对 printf 使用简单的 for 指令,但数组似乎为空。问题可能与我要打印的值的内存地址有关。

请看一下,欢迎任何建议!

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h>

int * rand_gen(int N, float fl_value); // Function declaration

int main()  // Main function
{

int N;  // Declaration: Number of trials
printf("Number of trials: ");
scanf("%d", &N);    // Asks for Number of trials

float alpha = 0.3;
float beta  = 0.4;
float gamma = 0.5;
float delta = 0.6;

int i;  // Index
int seed = time(NULL); // Random number generator seed (based on current time)
srand(seed);

// Populate arrays
float *bin_array_alpha[] = { rand_gen( N, alpha ) };
float *bin_array_beta[]  = { rand_gen( N, beta )  };
float *bin_array_gamma[] = { rand_gen( N, gamma ) };
float *bin_array_delta[] = { rand_gen( N, delta ) };



// Here I would like to print the elements of the arrays, something like:

for ( i=0 ; i<N ; i++)
{
    printf("\nbin_array_alpha[%d] = %f",i,bin_array_alpha[i]);
    printf("\nbin_array_beta[%d]  = %f",i,bin_array_beta[i]);
    printf("\nbin_array_gamma[%d] = %f",i,bin_array_gamma[i]);
    printf("\nbin_array_delta[%d] = %f",i,bin_array_delta[i]);
    printf("\n");
}


// Free the memory
static const size_t m = sizeof(bin_array_alpha)/sizeof(bin_array_alpha[0]);

for ( size_t i = 0 ; i < m ; ++i )
{
    free(bin_array_alpha[i]);
    free(bin_array_beta[i]);
    free(bin_array_gamma[i]);
    free(bin_array_delta[i]);

    bin_array_alpha[i] = NULL;
    bin_array_beta[i]  = NULL;
    bin_array_gamma[i] = NULL;
    bin_array_delta[i] = NULL;
}

printf("\n");

return(0);
}


// Function: generate an array populated by: array[j] = rand()*fl_value
int * rand_gen(int N, float fl_value)
{
    int *array;
    array = (int *)malloc(sizeof(float)*N);
    if(array == NULL)
    {
        printf("\nRun out of memory!\n");
        exit(1);
    }

    int j;
    float x;
    for( j = 0 ; j < N ; j++ )
    {
        x = rand(); // Generates a random number
        x = x/RAND_MAX; // 0 < x < 1
        x = x * fl_value;
        array[j] = x; // array[j] = x * fl_value
    }

    return array;
}

结果始终相同(例如 N=3):

bin_array_alpha[0] = 0.000000
bin_array_beta[0]  = 0.000000
bin_array_gamma[0] = 0.000000
bin_array_delta[0] = 0.000000

bin_array_alpha[1] = 0.000000
bin_array_beta[1]  = 0.000000
bin_array_gamma[1] = 0.000000
bin_array_delta[1] = 0.000000

bin_array_alpha[2] = 0.000000
bin_array_beta[2]  = 0.000000
bin_array_gamma[2] = 0.000000
bin_array_delta[2] = 0.000000

再次感谢您!

【问题讨论】:

  • 为什么array输入rand_genint *
  • 你有一个指向浮点数的数组,但你正在打印,就好像你有一个浮点数数组一样。并且您正在使用返回指向 int 的指针的函数中的一个元素初始化数组。
  • @user3386109 那么我应该如何打印指针以浮动?以及如何将初始化指针更改为 float 而不是指向 int 的指针?顺便谢谢你;)
  • 删除 4 个声明后的 []。该函数返回一个指针,尽管它的int* 指针与float* 指针不兼容..

标签: c arrays function pointers random


【解决方案1】:

您的问题在于分配的 float 数组,您不只是将其与 int 混淆,而是分配技术是错误的:

float **rand_gen(int N, float fl_value)
{
    float **array;
    array = (float **)malloc(sizeof(float *) * N + 1);
    if (array == NULL)
    {
        printf("\nRun out of memory!\n");
        exit(1);
    }
    int i;
    for (i = 0; i < N; i++)
    {
        array[i] = (int *)malloc(sizeof(float));
        array[i][0] = 0;
    }
    array[N] = NULL;

    int j;
    float x;
    for (j = 0; j < N; j++)
    {
        x = rand(); // Generates a random number
        x = x / RAND_MAX; // 0 < x < 1
        x = x * fl_value;
        *(array[j]) = x; // array[j] = x * fl_value
    }

    return array;
}

浮点数组是指向内存区域的指针,其中每个元素都是指向浮点数的指针。

这意味着您必须更正声明:

float **rand_gen(int N, float fl_value); // Function declaration

以及主要的用法:

float **bin_array_alpha = rand_gen(N, alpha);
float **bin_array_beta = rand_gen(N, beta);
float **bin_array_gamma = rand_gen(N, gamma);
float **bin_array_delta = rand_gen(N, delta);

printf 也是如此:

printf("\nbin_array_alpha[%d] = %f", i, *bin_array_alpha[i]);

为了释放内存,您不仅需要添加每个浮点数的释放空间,还需要添加内存基数的释放空间:

free(bin_array_alpha

【讨论】:

  • 成功了!太感谢了!我以前用 C 编程,但从来没有做过这种事情(函数中的数组等)。
  • 为什么float ** 你可以使用float * 以及为什么将malloc 返回为int ** ?它应该是 float ** 或者直接省略它。
  • 为什么我使用双指针?为了明确使用 float/char/int/...在指向数组的指针之前和每个元素所需的内存之后分配。我可以用一个设计示例来阐明 c 中的内存分配。我为此道歉。我希望现在很清楚我的意图。你的cmets对我来说很有价值。非常感谢
  • 这很好,但由于问题是关于生成随机数,因此指针内容不在上下文中,并增加了额外的复杂性,这是不相关的。
猜你喜欢
  • 2012-11-04
  • 1970-01-01
  • 2010-10-15
  • 2023-01-03
  • 1970-01-01
  • 1970-01-01
  • 2021-11-12
相关资源
最近更新 更多