环路内循环&随机生成c

时间:2013-06-18 14:52:26

标签: c for-loop random srand

我一直在摸不着头脑。 我看到很多关于如何在C循环中进行随机生成的主题,但是当涉及两个循环时我没有看到任何内容。

以下是我的代码:

typedef struct
{
    char qh_uid[6];
    long int qh_vd;
    long int qh_pd;
    long int qh_id;
    double qh_value;
}quote_history;

int records_size = 20;
int batch_size = 5;

char *rand_str(char *dst, int size)
{
    static const char text[] = "abcdefghijklmnopqrstuvwxyz"
                               "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    int i, len = size;
    for ( i = 0; i < len; ++i )
    {
        dst[i] = text[rand() % (sizeof text - 1)];
    }
    dst[i] = '\0';
    return dst;
 }

char *rand_tstp(char *dst, int size)
{
    static const char text[] = "0123456789";
    int i, len = size;
    for ( i = 0; i < len; ++i )
    {
        dst[i] = text[rand() % (sizeof text - 1)];
    }
    dst[i] = '\0';
    return dst;
}

double randfrom(double min, double max)
{
    double range = (max - min);
    double div = RAND_MAX / range;
    return min + (rand() / div);
}

quote_history *feed_batch(quote_history *qh_batch, int batchsize)
{
    int j;
    char mytext[6];
    char mylong[17];
    for (j = 0; j < batchsize; ++j)
    {
        quote_history qh_aux;
        printf("uid : %s - value : %lf\n",rand_str(mytext, sizeof mytext), randfrom(0,100000));
        strcpy(qh_aux.qh_uid, rand_str(mytext, sizeof mytext));
        qh_aux.qh_vd = strtol(rand_tstp(mylong, sizeof mylong), NULL, 10);
        qh_aux.qh_pd = strtol(rand_tstp(mylong, sizeof mylong), NULL, 10);
        qh_aux.qh_id = strtol(rand_tstp(mylong, sizeof mylong), NULL, 10);
        qh_aux.qh_value = randfrom(0,100000);
        qh_batch[j] = qh_aux;
    }
    printf("--------------\n");
    return qh_batch;
}

int
main(int           const argc,
     const char ** const argv) {

    quote_history *subArray;

    srand(time(NULL));
    int k;
    for (k = 0; k < (int)(records_size/batch_size); ++k) {
        subArray= (quote_history*)calloc(batch_size, sizeof(quote_history));
        subArray = feed_batch(subArray, batch_size);
        // Do something with subArray
        free(subArray);
    }
}

嗯,基本上,我想做的是生成struct quote_history的批处理(作为数组),其中对某些值进行随机生成,然后处理批处理并移动到另一个。

出于某种原因,随机生成在feed_batch函数中运行良好,但当它移动到循环中的下一个项目时,批处理始终保持不变。

忘记粘贴代码的结果:

uid : qJfzrJ - value : 64938.995598
uid : LyCadK - value : 23030.096583
uid : dcOicU - value : 26016.211568
uid : BmpSTV - value : 76145.000279
uid : aQvABq - value : 92286.726130
--------------
uid : qJfzrJ - value : 64938.995598
uid : LyCadK - value : 23030.096583
uid : dcOicU - value : 26016.211568
uid : BmpSTV - value : 76145.000279
uid : aQvABq - value : 92286.726130
--------------
uid : qJfzrJ - value : 64938.995598
uid : LyCadK - value : 23030.096583
uid : dcOicU - value : 26016.211568
uid : BmpSTV - value : 76145.000279
uid : aQvABq - value : 92286.726130
--------------
uid : qJfzrJ - value : 64938.995598
uid : LyCadK - value : 23030.096583
uid : dcOicU - value : 26016.211568
uid : BmpSTV - value : 76145.000279
uid : aQvABq - value : 92286.726130
--------------

我尝试了很多组合(例如循环中的循环而不是feed_batch函数)但没有成功。

我希望有人会帮助我。

弗洛里安

2 个答案:

答案 0 :(得分:1)

你的main分配一个quote_history字段并在for循环中释放它。

feed_batch接受此指针并将其作为一个数组进行访问 - &gt;您的调试器应报告内存访问错误。

新猜测:
我知道为什么你认为它确实有效(printfs是正确的)但在外面它不起作用。但这是猜测,因为代码丢失了: 我想你将mytext指针保存在你的结构中。所以最后所有的数组元素都指向同一个字符串。更糟糕的是,字符串是一个自动变量,在退出feed_batch后会缩小范围。

顺便说一下:
为什么需要动态分配? 简单地声明一个quote_history的对象并传递它的指针。 或声明一个quote_history对象数组。这里不需要动态分配。

答案 1 :(得分:1)

如果我理解您的代码,那么您缺少的是将随机生成的字符串复制到结构的数组qh_uid中。实际上你不需要复制,你可以直接在结构的缓冲区中生成随机字符串。

quote_history *feed_batch(quote_history *qh_batch, int batchsize)
{
    int j;
    for (j = 0; j < batchsize; ++j)
    {
        rand_str(qh_batch[j].qh_uid, sizeof(qh_batch[j].qh_uid) - 1);
        printf("uid : %s - value : %lf\n", qh_batch[j].qh_uid, randfrom(0,100000));
    }
    printf("--------------\n");
    return qh_batch;
}

Sander De Dycker在评论中提到的是真的,你不能写在qh_uid[6],你可以写的最大值是qh_uid[5],(通过这样做,除了对齐考虑因素,你实际上覆盖qh_vd的第一个字节,请记住数组索引从0开始。因此,-1添加到传递给rand_str的大小。

还要考虑vlad_tepesch关于分配的答案。