C 什么';我的代码怎么了?生成唯一随机数
我试图在1到10之间生成10个唯一的随机数。我总是收到重复的号码。有人能告诉我问题出在哪里吗?我的代码中缺少什么或需要修复什么?谢谢大家!C 什么';我的代码怎么了?生成唯一随机数,c,loops,random,C,Loops,Random,我试图在1到10之间生成10个唯一的随机数。我总是收到重复的号码。有人能告诉我问题出在哪里吗?我的代码中缺少什么或需要修复什么?谢谢大家! students[0].id = rand() % 10 + 1; for (int i = 1; i < 10; i++) { students[i].id = rand() % 10 + 1; for (int j = 0; j < i; j++) { if (students[i].id == stu
students[0].id = rand() % 10 + 1;
for (int i = 1; i < 10; i++)
{
students[i].id = rand() % 10 + 1;
for (int j = 0; j < i; j++)
{
if (students[i].id == students[j].id)
{
students[i].id = rand() % 10 + 1 ;
}
}
}
for (int i = 0; i < 10; i++)
{
printf("%d\n", students[i].id);
}
学生[0].id=rand()%10+1;
对于(int i=1;i<10;i++)
{
学生[i].id=rand()%10+1;
对于(int j=0;j函数rand()
不能保证生成唯一的随机数。此外,您限制范围的方式(mod 10)特别糟糕,可能会产生许多重复
生成序列的最简单方法可能是将10个值的数组从1洗牌到10。函数rand()
不能保证生成唯一的随机数。此外,您限制范围的方式(mod 10)特别糟糕,可能会产生许多重复
生成序列的最简单方法可能是将10个值的数组从1洗牌到10。rand()
本质上是随机的,因此不能保证给出唯一的结果。
您需要做一些类似的事情-跟踪到目前为止遇到的所有数字,并调用rand()
,直到您找到唯一的数字rand()
本质上是随机的,因此无法保证给您唯一的结果。
您需要做一些类似的事情,比如-跟踪到目前为止遇到的所有数字,并调用
rand()
,直到找到唯一的数字随机数并不意味着“无重复”随机数并不意味着“无重复”在您输入此if子句之后if(students[i].id==students[j].id)
和修改的students[i].id,您需要再次检查重复项。在您输入此if子句后,if(students[i].id==students[j].id)
和修改的students[i].id,您需要再次检查重复项
if (students[i].id == students[j].id)
{
students[i].id = rand() % 10 + 1 ;
}
在这一行中,您可能会得到重复
如果students[i].id&students[j].id=5,则表示它将变为真。但是在这行中,students[i].id=rand()%10+1代码>,您可能会再次获得5
您可以使用此代码,而不是上面的行
students[0].id = rand() % 10 + 1;
for (int i = 1; i < 10; i++)
{
students[i].id = rand() % 10 + 1;
for (int j = 0; j < i; j++)
{
if (students[i].id == students[j].id)
{
i--;
break;
}
}
}
学生[0].id=rand()%10+1;
对于(int i=1;i<10;i++)
{
学生[i].id=rand()%10+1;
对于(int j=0;j
在这一行中,您可能会得到重复
如果students[i].id&students[j].id=5,则表示它将变为真。但是在这行中,students[i].id=rand()%10+1代码>,您可能会再次获得5
您可以使用此代码,而不是上面的行
students[0].id = rand() % 10 + 1;
for (int i = 1; i < 10; i++)
{
students[i].id = rand() % 10 + 1;
for (int j = 0; j < i; j++)
{
if (students[i].id == students[j].id)
{
i--;
break;
}
}
}
学生[0].id=rand()%10+1;
对于(int i=1;i<10;i++)
{
学生[i].id=rand()%10+1;
对于(int j=0;j
试试这个方法:用while替换if。我希望你得到你的答案
学生[0]。id=rand()%10+1
对于(int i=1;i<10;i++)
{
}试试这个:用while替换if。我希望你得到你的答案 学生[0]。id=rand()%10+1 对于(int i=1;i<10;i++) {
}我想您希望不更换样品。您可以将索引存储在一个数组中,随机选取一个索引,同时将其从数组中删除
这样下次你画画时,它就不会重复了。我想你应该在不替换的情况下采样。您可以将索引存储在一个数组中,随机选取一个索引,同时将其从数组中删除 这样当你下次画画时,它就不会重复了。你需要
publicstaticvoidmain(字符串[]args)
{
System.out.println(generateRandomNumbers(10,newarraylist());
}
私有静态列表生成器DomainNumbers(整数maxLimit,列表randomNumberList)
{
对于(int i=0;i
您需要
publicstaticvoidmain(字符串[]args)
{
System.out.println(generateRandomNumbers(10,newarraylist());
}
私有静态列表生成器DomainNumbers(整数maxLimit,列表randomNumberList)
{
对于(int i=0;i
如果RAND_MAX(通常为32767)不能被10整除,会发生什么?与8和0相比,您可能更经常地获得介于1和7之间的值。这是一种偏见
我建议丢弃任何大于或等于32760的值(或者更确切地说,RAND_MAX-RAND_MAX%10
),并使用除法运算符构造随机数:
int x;
do {
x = rand();
} while (x >= RAND_MAX - RAND_MAX % 10);
x /= RAND_MAX / 10;
你会看到一个相当大的改进;事实上,这似乎是你最明显的偏见。然而,您获得的值的分布仍然不需要是一致的。使用查找表放弃以前选择的任何值:
int selected[10] = { 0 };
for (int i = 0; i < 10; i++) {
int x;
do {
x = rand();
} while (selected[x / RAND_MAX / 10] || x >= RAND_MAX - RAND_MAX % 10);
x /= RAND_MAX / 10;
selected[x] = 1;
student[i].id = x;
}
for (int i = 0; i < 10; i++) {
printf("student[%d].id: %d\n", i, students[i].id);
}
int selected[10]={0};
对于(int i=0;i<10;i++){
int x;
做{
x=兰德();
}while(选中[x/RAND|u MAX/10]| x>=RAND|u MAX-RAND_MAX%10);
x/=RAND_MAX/10;
所选[x]=1;
学生[i].id=x;
}
对于(int i=0;i<10;i++){
printf(“学生[%d].id:%d\n”,i,学生[i].id);
}
有什么问题
int x;
do {
x = rand();
} while (x >= RAND_MAX - RAND_MAX % 10);
x /= RAND_MAX / 10;
int selected[10] = { 0 };
for (int i = 0; i < 10; i++) {
int x;
do {
x = rand();
} while (selected[x / RAND_MAX / 10] || x >= RAND_MAX - RAND_MAX % 10);
x /= RAND_MAX / 10;
selected[x] = 1;
student[i].id = x;
}
for (int i = 0; i < 10; i++) {
printf("student[%d].id: %d\n", i, students[i].id);
}