我想生成0到1000之间不重复的独特随机数(即6不会出现两次),但是不想使用类似于O(N)搜索先前值的方法来实现。这是否可能?
我想生成0到1000之间不重复的独特随机数(即6不会出现两次),但是不想使用类似于O(N)搜索先前值的方法来实现。这是否可能?
for i from n−1 downto 1 do
j ← random integer such that 0 ≤ j ≤ i
exchange a[j] and a[i]
实际上它是O(n-1),因为你只需要交换最后两个
这是C#
public static List<int> FisherYates(int n)
{
List<int> list = new List<int>(Enumerable.Range(0, n));
Random rand = new Random();
int swap;
int temp;
for (int i = n - 1; i > 0; i--)
{
swap = rand.Next(i + 1); //.net rand is not inclusive
if(swap != i) // it can stay in place - if you force a move it is not a uniform shuffle
{
temp = list[i];
list[i] = list[swap];
list[swap] = temp;
}
}
return list;
}
for(i=0;i<10; ++i) {
arr[i].index = i;
arr[i].ran = rand();
}
按照arr[i].ran中的值对数组进行排序。 str.index现在是随机顺序。 以下是C代码:
#include <stdio.h>
#include <stdlib.h>
struct RanStr { int index; int ran;};
struct RanStr arr[10];
int sort_function(const void *a, const void *b);
int main(int argc, char *argv[])
{
int cnt, i;
//seed(125);
for(i=0;i<10; ++i)
{
arr[i].ran = rand();
arr[i].index = i;
printf("arr[%d] Initial Order=%2d, random=%d\n", i, arr[i].index, arr[i].ran);
}
qsort( (void *)arr, 10, sizeof(arr[0]), sort_function);
printf("\n===================\n");
for(i=0;i<10; ++i)
{
printf("arr[%d] Random Order=%2d, random=%d\n", i, arr[i].index, arr[i].ran);
}
return 0;
}
int sort_function(const void *a, const void *b)
{
struct RanStr *a1, *b1;
a1=(struct RanStr *) a;
b1=(struct RanStr *) b;
return( a1->ran - b1->ran );
}
O(n)
),那么下面许多答案都是错误的,包括被接受的答案。 - jww