簡體   English   中英

如何使用C中的函數生成隨機浮點數數組

[英]How to generate array of random float numbers using functions in C

我已經問了一個有關程序的問題 我得到了答案,但是有一個新問題。 我編寫的程序無法正常工作,我也不知道為什么。

該函數運行良好(我想),但是我想通過打印數組中每個元素的值來確定它們是否正確(我將其用於其他目的)。

我試圖一個printf指令簡單,但數組似乎是空的。 問題可能與我要打印的值的內存地址有關。

請看一下,任何建議都將受到歡迎!

#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

再次感謝你!

您的問題在於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數組是指向存儲區的指針,其中每個元素都是指向float的指針。

這意味着您必須更正聲明:

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]);

而是要釋放內存,您不僅需要添加每個float的空閑空間,還需要添加內存的空閑空間:

free(bin_array_alpha

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM