prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 13.19

我如何返回一个完全不重复的随机数序列?


你正在寻找的通常被称为“随机置换”或“洗牌”。一种方法是初始化一个数组,其中包含要打乱的值,然后随机地将数组中的每个单元格与后面的另一个单元格进行交换。

	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 页


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管