你好,我正在写一个程序,将产生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;
}number变量包含10,输出只需在数组中打印这10个字符。编译器没有错误,但是程序生成相同的字符集。谢谢你的帮助!
发布于 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
您可以按以下方式更新代码。
#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发布于 2017-03-03 04:36:06
您需要使用srand()初始化伪随机数生成器。
只需将其添加到main()之后即可。
srand(time(NULL));srand(time(NULL))实际上所做的是使用种子值生成伪随机数,time(NULL)返回当前的日历时间。
因此,理论上,您的srand()函数可以保证在每个运行时获得不同的种子值。因此,每次rand()产生的值都是不同的。
发布于 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)不同,取决于您的体系结构。
所以,总而言之,你最终可能会:
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;
}https://stackoverflow.com/questions/42570700
复制相似问题