41 {
42
43 assert(
array != NULL );
44
45 long long elemCnt, maxElemCnt, sec,
i;
46 long long currElemCnt, uniqIndex, taken;
47 uintptr_t **p, *next;
48 long long currSecSize = secSize;
49 long long secCnt = 1+len/secSize;
50 long long *availableNumbers;
51
52 p = (uintptr_t **)&
array[0];
53
54 maxElemCnt = currSecSize/stride;
55 availableNumbers = (long long *)calloc(maxElemCnt, sizeof(long long));
56
57
58 for(sec=0; sec<secCnt; ++sec){
59
60
61 if( sec == secCnt-1 )
62 currSecSize = (len%secSize);
63
64 for(
i=0;
i<maxElemCnt;
i++)
65 availableNumbers[
i] =
i;
66
67 currElemCnt = currSecSize/stride;
68
69 taken = 0;
70
71
72 if( 0==sec )
73 taken = 1;
74 long long remainingElemCnt = currElemCnt;
75
76 for(elemCnt=0; elemCnt<currElemCnt-taken; ++elemCnt){
77
78 long long index = taken + random() % (remainingElemCnt-taken);
79
80 uniqIndex = sec*secSize + stride*availableNumbers[index];
81
82 availableNumbers[index] = availableNumbers[remainingElemCnt-1];
83
84 remainingElemCnt--;
85
86
87 next = &
array[uniqIndex];
88 *p = next;
89 p = (uintptr_t **)next;
90 }
91 }
92
93
95 *p = next;
96
97 free(availableNumbers);
98
99 return;
100}
static double array[ARRAYSIZE]