Commit | Line | Data |
---|---|---|
1 | #include "apl.h" | |
2 | ||
3 | ex_deal() | |
4 | { | |
5 | register struct item *p; | |
6 | register m, n; | |
7 | double f; | |
8 | data d1, d2; | |
9 | ||
10 | m = topfix(); | |
11 | n = topfix(); | |
12 | if(m < 0 || m > n) | |
13 | error("deal D"); | |
14 | p = newdat(DA, 1, m); | |
15 | datum = thread.iorg; | |
16 | for(; n!=0; n--) { | |
17 | f = m; | |
18 | f /= n; | |
19 | if(rand()/(32768.*32768.*2.) < f) { | |
20 | putdat(p, datum); | |
21 | m--; | |
22 | } | |
23 | datum += one; | |
24 | } | |
25 | m = p->size; | |
26 | while(m > 0) { | |
27 | f = rand()/(32768.*32768.*2.); | |
28 | n = m * f; | |
29 | m--; | |
30 | if(n != m) { | |
31 | p->index = n; | |
32 | d1 = getdat(p); | |
33 | p->index = m; | |
34 | d2 = getdat(p); | |
35 | p->index = n; | |
36 | putdat(p, d2); | |
37 | p->index = m; | |
38 | putdat(p, d1); | |
39 | } | |
40 | } | |
41 | push(p); | |
42 | } |