source: tags/initial/TREEGEN/spreadin.c

Last change on this file was 2, checked in by oldcode, 23 years ago

Initial revision

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 2.1 KB
Line 
1#define  __MODUL__
2#include "spreadin.h"
3
4#ifndef __STDLIB_H
5    #include <stdlib.h>
6#endif
7
8/* -------------------------------------------------------------------------- */
9/*        Spreading newSpreading(double *value, int values) */
10/* ------------------------------------------------------ 20.05.95 16:42 ---- */
11Spreading newSpreading(double *value, int values)
12{
13    Spreading s;
14    int       v;
15    double    val = 0.0,
16              sum = 0.0;
17
18    s = malloc(sizeof(struct S_Spreading));
19    if (!s) outOfMemory();
20
21    assert(values>0);
22
23    s->values = values;
24    s->border = malloc(sizeof(*(s->border))*values);
25    if (!s->border) outOfMemory();
26
27    for (v = 0; v<values; v++) sum += value[v];      /* Summe bilden */
28
29    for (v = 0; v<values; v++)
30    {
31        val          += value[v];
32        s->border[v]  = (val/sum)*RAND_MAX;
33    }
34
35    s->border[values-1] = RAND_MAX;
36
37/*    for (v = 0; v<values; v++) printf("%f -> %i\n", value[v], s->border[v]); */
38/*    printf("---\n"); */
39
40    return s;
41}
42/* -------------------------------------------------------------------------- */
43/*        void freeSpreading(Spreading s) */
44/* ------------------------------------------------------ 20.05.95 16:42 ---- */
45void freeSpreading(Spreading s)
46{
47    free(s->border);
48    free(s);
49}
50/* -------------------------------------------------------------------------- */
51/*        int spreadRand(Spreading s) */
52/* ------------------------------------------------------ 20.05.95 16:42 ---- */
53int spreadRand(Spreading s)
54{
55    int val = rand(),
56        l   = 0,
57        h   = s->values-1,
58        m;
59
60    while (1)
61    {
62        m = (l+h)/2;
63
64        if (val<=s->border[m])
65        {
66            if (m==0 || val>s->border[m-1]) break;
67            h = m;
68        }
69        else
70        {
71            if (m==(h-1))
72            {
73                if (val<=s->border[h])
74                {
75                    m = h;
76                    break;
77                }
78            }
79
80            l = m;
81        }
82    }
83
84    assert(m>=0 && m<s->values);
85    assert(val<=s->border[m]);
86    assert(m==0 || val>=s->border[m-1]);
87
88    return m;
89}
90
91
Note: See TracBrowser for help on using the repository browser.