我的代码出了什么问题?生成唯一随机数

时间:2013-04-11 05:43:14

标签: 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 == students[j].id)
        {
            students[i].id = rand() % 10 + 1 ;
        }
    }
}

for (int i = 0; i < 10; i++)
{
    printf("%d\n", students[i].id);
}

9 个答案:

答案 0 :(得分:2)

函数rand()无法保证生成唯一的随机数。此外,限制范围(mod 10)的方式特别糟糕,可能会产生许多重复。

生成序列的最简单方法可能是将10个值的数组从1改为10。

答案 1 :(得分:2)

if (students[i].id == students[j].id)
        {
            students[i].id = rand() % 10 + 1 ;
        }

在这一行中,您可能会重复。

如果学生[i] .id&amp;学生[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;
        }
    }
}

答案 2 :(得分:1)

rand()本质上是随机的,因此无法保证为您提供独特的结果。 您需要执行this之类的操作 - 跟踪到目前为止遇到的所有数字并调用rand(),直到找到唯一数字

答案 3 :(得分:0)

随机并不意味着“没有重复”。

答案 4 :(得分:0)

输入if条款if (students[i].id == students[j].id)并修改学生[i] .id后,您需要再次检查重复项。

答案 5 :(得分:0)

试试这个:用while替换。我希望你得到答案。

students [0] .id = rand()%10 + 1;

for(int i = 1; i&lt; 10; i ++)

{

students[i].id = rand() % 10 + 1;
for (int j = 0; j < i; j++)
{
    while (students[i].id == students[j].id)
    {
        students[i].id = rand() % 10 + 1 ;
    }
}

}

for(int i = 0; i&lt; 10; i ++)

{

printf("%d\n", students[i].id);

}

答案 6 :(得分:0)

我想你想要无需更换的样品。您可以将索引存储在一个数组中,随机选择一个和一个。同时将其从阵列中删除。

因此,当您下次绘制时,它不会重复。

答案 7 :(得分:0)

您需要recursion

public static void main(String[] args)
{
    System.out.println(generateRandomNumbers(10, new ArrayList<Integer>()));
}

private static List<Integer> generateRandomNumbers(Integer maxLimit, List<Integer>    randomNumberList)
{
    for (int i = 0; i < maxLimit; i++)
    {
        Integer tempRandom = new Random().nextInt(10);
        if (randomNumberList.contains(tempRandom))
            generateRandomNumbers(1, randomNumberList);
        else
            randomNumberList.add(tempRandom);
    }
    return randomNumberList;
}

答案 8 :(得分:0)

如果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);
}