1

我有以下代码。我想要完成的是从头文件中的所有数组中“生成”一个随机名称/地址/Zip。问题是我任何时候都得到相同的地址,所以我做错了。

xtmtrx@server:~/coding/c/work$ ./randaddr
Olivier|Suh|28 King Street Apt 21|11934
xtmtrx@server:~/coding/c/work$ ./randaddr
Olivier|Suh|28 King Street Apt 21|11934
xtmtrx@server:~/coding/c/work$ ./randaddr
Olivier|Suh|28 King Street Apt 21|11934
xtmtrx@server:~/coding/c/work$

randaddr.c

#include <stdio.h>
#include <stdlib.h>
#include "first.h"
#include "last.h"
#include "streets.h"
#include "zips.h"

int main() {
    const size_t firsts_count = sizeof(firsts) / sizeof(firsts[0]);
    const size_t lasts_count = sizeof(lasts) / sizeof(lasts[0]);
    const size_t streets_count = sizeof(streets) / sizeof(streets[0]);
    const size_t zips_count = sizeof(zips) / sizeof(zips[0]);
    printf("%s|%s|%s|%s\n", firsts[rand() % firsts_count], lasts[rand() % lasts_count], streets[rand() % streets_count], zips[rand() % zips_count]);
    return 0;
}

第一个.h

const char *firsts[] = {
        "Asgar",
        "Aadit",
        "Aanand",
        "Aaron",
        "Aarti",
        "Aasha",
        "Abby",
        "Abdel",
        "Abdoulaye"
};

最后一个.h

const char *lasts[] = {
        "ALI",
        "ALZAYED",
        "ARSAN",
        "Abdelmaseeh",
        "Abdulla",
        "Abebe",
        "Aber",
        "Abeshi",
        "Abraham"
};

街道.h

const char *streets[] = {
        "1000 Park Ave",
        "1001 Park Avenue",
        "1003 St. Nicholas Ave.",
        "100 Bleecker St",
        "100 E31st St",
        "100 East 68th Street Apt. 14E",
        "100 Jane St.",
        "100 Jane St PH-J",
        "100 John St. Apt 2208"
};

zips.h

const char *zips[] = {
        "00501",
        "00544",
        "06390",
        "10001",
        "10002",
        "10003",
        "10004",
        "10005",
        "10006"
};
4

2 回答 2

6

这是因为您尚未播种随机数生成器。

一个常见的简单方法是调用:

srand(time(NULL));

第一次调用rand().

这使用srand()(我猜是“种子随机”)函数,向它传递一个数字(当前时间),每次运行程序时都可能不同。

阅读关于伪随机数生成器的维基百科文章,了解有关幕后内容的更多信息。随机性很难。

于 2013-06-13T08:08:56.813 回答
3

这是因为 rand()每次调用程序时都会使用相同的种子开始生成伪随机数。

在 main() 开始时调用 srand() 一次将种子初始化为不同的值,例如

srand(time(NULL));

(由于 time() 的分辨率为秒,如果您在同一秒内多次调用该程序,您将获得相同的随机数)另一种选择可能是

srand((int)getpid());
于 2013-06-13T08:09:19.737 回答