1、使用 srand() 设置种子
要解决这个问题,你需要为每次程序运行提供一个 不同的种子。可以通过 srand()
函数设置随机数生成器的种子。常见的做法是使用 当前时间 作为种子,因为它每次都不同。
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { // 根据当前时间设置种子 srand(time(NULL)); // 生成并打印随机数 for (int i = 0; i < 5; i++) { printf("%d\n", rand()); } return 0; }
2、使用 rand() 生成随机数并模运算
可以通过模运算来限制生成的随机数范围,并确保每次运行时,种子不同。
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { // 设置种子 srand(time(NULL)); // 生成范围在 0 到 99 之间的随机数 printf("%d\n", rand() % 100); return 0; }
3、使用更好的随机数生成器(random())
在一些系统中,random()
函数比 rand()
更加高效和随机性更好。它是一个更为先进的随机数生成器,且不依赖于种子(在多数情况下会自动使用系统时间等变动因素)。
#include <stdio.h> #include <stdlib.h> int main() { // 生成随机数 printf("%ld\n", random()); return 0; }
4、使用更复杂的时间戳
如希望种子值更加不可预测,可以将更精细的时间信息作为种子,例如使用毫秒级别的时间戳。
#include <stdio.h> #include <stdlib.h> #include <sys/time.h> int main() { struct timeval tv; gettimeofday(&tv, NULL); srand((unsigned int)(tv.tv_sec * 1000 + tv.tv_usec / 1000)); printf("Random number: %d\n", rand()); return 0; }
5、使用 C11 标准库的 rand() 替代方法(random())
在一些支持 C11 标准的编译器中,可以使用 random()
函数代替 rand()
。random()
提供了比 rand()
更好的随机性,但仍然依赖于种子。可以通过 srandom()
设置种子。
#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { // 设置种子 srandom((unsigned int)time(NULL)); // 生成随机数 printf("Random number: %ld\n", random()); return 0; }
6、使用 rand() 自定义生成器
可以通过自定义的伪随机数生成算法来替代 rand()
和 srand()
。例如,可以使用线性同余生成器(LCG)来生成随机数序列。
#include <stdio.h> unsigned int my_rand(unsigned int *seed) { // 线性同余生成器(LCG)参数 *seed = *seed * 1664525 + 1013904223; return (*seed) >> 16; } int main() { unsigned int seed = 12345; // 初始种子值 // 生成随机数 printf("Random number: %u\n", my_rand(&seed)); return 0; }