1

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);
}
4

9 に答える 9

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

この行では、重複する可能性があります。

学生[i].id &学生[j].id = 5の場合、trueになることを意味します。しかし、この行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;
        }
    }
}
于 2013-04-11T05:51:53.460 に答える
0

これを試してください: if を while に置き換えます。答えが得られることを願っています。

学生[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++)
{
    while (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);

}

于 2013-04-11T05:59:21.593 に答える
0

再帰が必要です。

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;
}
于 2013-04-11T06:11:26.420 に答える
0

差し替えなしでサンプリングしたいと思います。インデックスを配列に保存し、ランダムに選択して、同時に配列から削除することができます。

次に描くときに繰り返さないように。

于 2013-04-11T06:09:16.817 に答える