问我如何返回一个完全不重复的随机数序列?
答你正在寻找的通常被称为“随机置换”或“洗牌”。一种方法是初始化一个数组,其中包含要打乱的值,然后随机地将数组中的每个单元格与后面的另一个单元格进行交换。
int a[10], i, nvalues = 10; for(i = 0; i < nvalues; i++) a[i] = i + 1; for(i = 0; i < nvalues-1; i++) { int c = randrange(nvalues-i); int t = a[i]; a[i] = a[i+c]; a[i+c] = t; /* swap */ }其中randrange(N)是rand() / (RAND_MAX/(N) + 1)或问题 13.16 中的其他表达式之一。
参考文献:Knuth 第 3.4.2 节,第 137-8 页