我正在尝试生成一个包含10个随机但唯一字符的数组。有时,当我运行代码时,字符不是唯一的。
我将不胜感激任何帮助。谢谢。
SELECT t1.*
FROM yourTable t1
INNER JOIN
(
SELECT position, MIN(user) AS min_user
FROM yourTable
GROUP BY position
) t2
ON t1.position = t2.position AND
t1.user = t2.min_user
答案 0 :(得分:3)
问题是随机可以给出相同的数字。它并不知道你每次都想要一个不同的数字。
这是如何解决这个问题,我告诉你的方法,你需要对它进行编程。
确定参与的字符,然后创建一个包含这些字符的数组。
然后滚动骰子以在数组范围内给出数字。您获得的数字是数组的索引,然后您获取该索引中的字符。
然后取出数组中的最后一个字符并放入该索引,下次掷骰子时,将最大数量限制为比数组原始大小减去一个。
继续使用此算法,直到获得所需的所有字符数。
此算法可确保您获得不同的字符。
答案 1 :(得分:0)
只有您刚刚生成的字符与数组中的前一个字符不同时,您的代码才会进行检查;你应该尝试这样的旗帜:
srand(time(NULL));
char letters[10];
int is_unique = 1, i=0,j ;
while (i<10){
is_unique = true;
letters[i] = 'a' + rand() % 26;
for(j=0;j<i;j++){
if (letters[i]==letters[j])
is_unique = false;
}
if (is_unique)
i++;
}
顺便说一句,最好用26替换rand() % (122-97)
,对于阅读代码的人来说,这一点更清楚。
另一种方式是:
srand(time(NULL));
char letters[10];
int j;
for (int i = 0; i < 10; i++)
{
letters[i] = 'a' + rand() % 26;
j=0;
while (j<i) {
if (letters[i]==letters[j]){
letters[i] = 'a' + rand() % 26;
j = 1;
} else
j++;
}
printf("%c\n", letters[i]);
}