首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >生成10个随机字符

生成10个随机字符
EN

Stack Overflow用户
提问于 2017-03-03 04:31:14
回答 3查看 3.5K关注 0票数 1

你好,我正在写一个程序,将产生10个随机字符,以形成一个词(这是一个游戏)。

这是我的功能:

代码语言:javascript
复制
void GenerateTen(int number)
{
    int i; 
    char abc[30]="abcdefghijklmnopqrstuvwxyz";
    char newabc[8];


    for (i = 0; i < number; ++i) {
        newabc[i] = abc[rand() % (sizeof(abc) - 1)];
        printf("%c ", newabc[i]);
    }

    newabc[number] = 0;

}

number变量包含10,输出只需在数组中打印这10个字符。编译器没有错误,但是程序生成相同的字符集。谢谢你的帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-03-03 04:39:22

我有你的问题。你必须播种它。用时间播种它是个好主意:srand()

rand()返回pseudo-random数字。它根据给定的算法生成数字。该算法的起点总是相同的,因此您将看到为每次调用生成的相同序列。

您可以使用srand函数设置随机生成器的“种子”(只在程序中调用srand一次)。从rand()生成器获取不同序列的一种常见方法是将种子设置为进程的当前时间或id:

在程序开始时使用srand(time(NULL));srand(getpid());

参考资料:https://stackoverflow.com/a/1108810/5352399

您可以按以下方式更新代码。

代码语言:javascript
复制
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
    srand(time(NULL));
    for(int i = 0; i < 5; i++){
        GenerateTen(8);
    }
    return 0;
}

void GenerateTen(int number) {
    int i; 
    char abc[26]="abcdefghijklmnopqrstuvwxyz";
    char newabc[8];
    for (i = 0; i < number; ++i) {
        newabc[i] = abc[rand() % (sizeof(abc) - 1)];
        printf("%c ", newabc[i]);
    }
    newabc[number] = 0;
}

它的产出如下:

代码语言:javascript
复制
r x r a f d a b 
f f t i x m l b 
r k j e p h d v 
s w a c p g v h 
e n j l r j n w
票数 2
EN

Stack Overflow用户

发布于 2017-03-03 04:36:06

您需要使用srand()初始化伪随机数生成器。

只需将其添加到main()之后即可。

代码语言:javascript
复制
srand(time(NULL));

srand(time(NULL))实际上所做的是使用种子值生成伪随机数,time(NULL)返回当前的日历时间。

因此,理论上,您的srand()函数可以保证在每个运行时获得不同的种子值。因此,每次rand()产生的值都是不同的。

票数 1
EN

Stack Overflow用户

发布于 2017-03-03 06:13:26

除了调用srand()之外,您还应该非常小心地实际分配一个由8个元素组成的数组(char newabc[8]),并将其索引到number,因此在number >= 8时应该会出现缓冲区溢出。因为你没有归还它,你可以移除它。如果您计划返回它,您应该预先分配它:char* newabc = (char*)calloc(number+1, sizeof(char));

还可以通过认识到char abc[30]实际上是'a' + rand() % 26来删除abc[rand() % (sizeof(abc) - 1)]。除非您想使用带有字母子集的自定义字典,在这种情况下,最好将它保存在全局内存中(函数之外,或者函数中的static,如果您想限制它的作用域)。请注意,sizeof(abc)可能与strlen(abc)不同,取决于您的体系结构。

所以,总而言之,你最终可能会:

代码语言:javascript
复制
char* generate_random(int number) // Better C-style name
{
    int i; 
    char* newabc = (char*)calloc(number, sizeof(char));

    if (newabc == NULL)
        return NULL;

    for (i = 0; i < number; ++i) {
        newabc[i] = 'a' + (rand() % 26);
        // printf("%c ", newabc[i]); // Not needed anymore, except for debugging
    }
    // newabc[number] = 0; // Not needed because we used 'calloc()' which zeroes the allocated memory

    return newabc;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42570700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档