2017-03-03 91 views
1

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

所以这里是我的功能:

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; 

} 

数量变量包含10和输出应该是简单地在阵列中打印这些10个字符。编译器没有错误,但程序会生成相同的一组字符。感谢您的帮助! :-)

+0

程序生成相同的字符集 - 这是什么意思?这里的实际问题是什么? –

+0

它应该随机生成不同的集合 – Erail

+1

您真的想在循环前使用'newabc [i] = abc [rand()%strlen(abc)]'为了效率,预计算:'len = strlen(abc) i] = abc [rand()%len]'。 'sizeof'会在某些点注入0x00。而且,如果你得到相同的数字,你可能想要查看'srand'函数(例如'srand(time(NULL));''main''是通常的方式) –

回答

2

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

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

你可以用srand函数(只在程序中调用srand一次)设置随机发生器的“种子”。以获得从RAND)不同的序列(一种常见方式发生器是设置种子为当前时间或处理的id:

函数srand(时间(NULL));srand(getpid());在节目的开始。

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


如下,您可以更新您的代码。

#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; 
} 

它输出:

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 
+0

按预期工作。非常感谢你! : - ) – Erail

1

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

只需在您的main()后面添加这个项目。

srand(time(NULL)); 

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

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

0

除了呼吁srand(),你应该非常小心,你实际上是分配8个元素的数组(char newabc[8])和索引它到number,所以你当number >= 8)应该预期缓冲区溢出)。由于你没有返回它,你可以删除它。如果您打算在返回它,你应该事先分配它:char* newabc = (char*)calloc(number+1, sizeof(char));

您也可以通过实现abc[rand() % (sizeof(abc) - 1)]实际上是'a' + rand() % 26删除char abc[30]。除非你想用一个字母子集的自定义字典,在这种情况下,最好将其保存在全局内存中(在函数之外,或者如果你想限制它的作用域,则在函数内部保存为static)。并且请注意,根据您的架构,sizeof(abc)可能与strlen(abc)不一样。

所以,这一切的一切,你可以结束了:

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; 
}