Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 什么';我的代码怎么了?生成唯一随机数_C_Loops_Random - Fatal编程技术网

C 什么';我的代码怎么了?生成唯一随机数

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

我试图在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 == 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);
}