C 如何防止随机变量重复相同的数字
所以我只是在学习C,我想知道如何防止使用rand()函数随机化的变量重复相同的数字。我有一个脚本,它简单地将一个变量随机化并在for循环中打印4次。如何使变量在每次使用rand()函数后都不会得到相同的数字C 如何防止随机变量重复相同的数字,c,variables,random,C,Variables,Random,所以我只是在学习C,我想知道如何防止使用rand()函数随机化的变量重复相同的数字。我有一个脚本,它简单地将一个变量随机化并在for循环中打印4次。如何使变量在每次使用rand()函数后都不会得到相同的数字 #include <stdio.h> #include <stdlib.h> int randomInt; int main() { srand(time(0)); for (int i = 0; i < 4; ++i) { ra
#include <stdio.h>
#include <stdlib.h>
int randomInt;
int main()
{
srand(time(0));
for (int i = 0; i < 4; ++i) {
randomInt = rand() % 4;
printf("%d\n", randomInt);
}
return 0;
}
#包括
#包括
int-randomInt;
int main()
{
srand(时间(0));
对于(int i=0;i<4;++i){
randomInt=rand()%4;
printf(“%d\n”,randomInt);
}
返回0;
}
在大多数机器上,int
是32位。因此,在232次迭代之后,您肯定会得到一些重复(而且可能会更早)
如果你限制自己的循环要少得多,考虑一下保持一个以前满足的随机数数组(或者一些哈希表,或者一些二进制树,或者其他容器)。 对于仅重复4次的循环,保留一个先前发出的数字数组(最多4-1个)非常简单,而且足够有效
另请阅读有关。在大多数机器上,
int
为32位。因此,在232次迭代之后,您肯定会得到一些重复(而且可能会更早)
如果你限制自己的循环要少得多,考虑一下保持一个以前满足的随机数数组(或者一些哈希表,或者一些二进制树,或者其他容器)。 对于仅重复4次的循环,保留一个先前发出的数字数组(最多4-1个)非常简单,而且足够有效
另外,请阅读。您可以做的是跟踪您已经生成的每个数字
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int hasMyNumberAlreadyBeenGenerated(int number, int generatedNumbers[], int size){
for(int i = 0; i < size + 1; i++){
//If you already generated the number, it should be present somewhere in your array
if(generatedNumbers[i] == number) return 1;
//If you did not, find the first available space in your array, and put the number you generated into that space
if(generatedNumbers[i] == 0){
generatedNumbers[i] = number;
break; //No need to continue to check the array
}
}
return 0;
}
int main()
{
int randomInt;
int generatedNumbers[4];
//We set "0" in all the array, to be sure that the array doesn't contain unknown datas when we create it
memset(generatedNumbers, 0x0, sizeof(generatedNumbers));
srand(time(0));
for (int i = 0; i < 4; ++i) {
randomInt = rand() % 4 + 1;
//As long as the number you generate has already been generated, generate a new one
while(hasMyNumberAlreadyBeenGenerated(randomInt, generatedNumbers, i) == 1){
randomInt = rand() % 4 + 1;
}
printf("generated : %d\n", randomInt);
}
return 0;
}
#包括
#包括
#包括
int HasMyNumberReadyBeenGenerated(int编号,int generatedNumbers[],int大小){
对于(int i=0;i
这个方法的问题是,你不能生成一个0,因为如果你这样做,你将无休止地循环。
可以使用malloc()函数使用动态数组绕过此问题。
如果你想写干净的代码,你应该定义你想用#define生成多少个数字。你能做的就是跟踪你已经生成的每个数字
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int hasMyNumberAlreadyBeenGenerated(int number, int generatedNumbers[], int size){
for(int i = 0; i < size + 1; i++){
//If you already generated the number, it should be present somewhere in your array
if(generatedNumbers[i] == number) return 1;
//If you did not, find the first available space in your array, and put the number you generated into that space
if(generatedNumbers[i] == 0){
generatedNumbers[i] = number;
break; //No need to continue to check the array
}
}
return 0;
}
int main()
{
int randomInt;
int generatedNumbers[4];
//We set "0" in all the array, to be sure that the array doesn't contain unknown datas when we create it
memset(generatedNumbers, 0x0, sizeof(generatedNumbers));
srand(time(0));
for (int i = 0; i < 4; ++i) {
randomInt = rand() % 4 + 1;
//As long as the number you generate has already been generated, generate a new one
while(hasMyNumberAlreadyBeenGenerated(randomInt, generatedNumbers, i) == 1){
randomInt = rand() % 4 + 1;
}
printf("generated : %d\n", randomInt);
}
return 0;
}
#包括
#包括
#包括
int HasMyNumberReadyBeenGenerated(int编号,int generatedNumbers[],int大小){
对于(int i=0;i
这个方法的问题是,你不能生成一个0,因为如果你这样做,你将无休止地循环。
可以使用malloc()函数使用动态数组绕过此问题。
如果你想写干净的代码,你应该定义你想用一个#define生成多少个数字。我猜你得到的数字是相同的,因为你在同一秒内多次运行你的程序。如果时间(0)未更改,则将生成相同的种子和相同的随机数。除非您的程序运行得非常快,否则我认为使用基于微秒而不是秒的种子将有效:
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
int randomInt;
int main()
{
struct timeval my_microtimer;
gettimeofday(&t1, NULL);
srand(t1.tv_sec * my_microtimer.tv_usec);
for (int i = 0; i < 4; ++i) {
randomInt = rand() % 4;
printf("%d\n", randomInt);
}
return 0;
}
#包括
#包括
#包括
int-randomInt;
int main()
{
struct timeval my_microtimer;
gettimeofday(&t1,NULL);
srand(t1.tv_sec*my_microtimer.tv_usec);
对于(int i=0;i<4;++i){
randomInt=rand()%4;
printf(“%d\n”,randomInt);
}
返回0;
}
我猜您得到的数字是相同的,因为您的程序在同一秒内运行了多次。如果时间(0)未更改,则将生成相同的种子和相同的随机数。除非您的程序运行得非常快,否则我认为使用基于微秒而不是秒的种子将有效:
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
int randomInt;
int main()
{
struct timeval my_microtimer;
gettimeofday(&t1, NULL);
srand(t1.tv_sec * my_microtimer.tv_usec);
for (int i = 0; i < 4; ++i) {
randomInt = rand() % 4;
printf("%d\n", randomInt);
}
return 0;
}
#包括
#包括
#包括
int-randomInt;
int main()
{
struct timeval my_microtimer;
gettimeofday(&t1,NULL);
srand(t1.tv_sec*my_microtimer.tv_usec);
对于(int i=0;i