File: random.c

package info (click to toggle)
numerix 0.22-4
  • links: PTS, VCS
  • area: main
  • in suites: lenny
  • size: 4,380 kB
  • ctags: 4,165
  • sloc: asm: 26,210; ansic: 12,168; ml: 4,912; sh: 3,899; pascal: 414; makefile: 179
file content (94 lines) | stat: -rw-r--r-- 3,578 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// file kernel/n/c/random.c: random numbers
/*-----------------------------------------------------------------------+
 |  Copyright 2005-2006, Michel Quercia (michel.quercia@prepas.org)      |
 |                                                                       |
 |  This file is part of Numerix. Numerix is free software; you can      |
 |  redistribute it and/or modify it under the terms of the GNU Lesser   |
 |  General Public License as published by the Free Software Foundation; |
 |  either version 2.1 of the License, or (at your option) any later     |
 |  version.                                                             |
 |                                                                       |
 |  The Numerix Library is distributed in the hope that it will be       |
 |  useful, but WITHOUT ANY WARRANTY; without even the implied warranty  |
 |  of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU  |
 |  Lesser General Public License for more details.                      |
 |                                                                       |
 |  You should have received a copy of the GNU Lesser General Public     |
 |  License along with the GNU MP Library; see the file COPYING. If not, |
 |  write to the Free Software Foundation, Inc., 59 Temple Place -       |
 |  Suite 330, Boston, MA 02111-1307, USA.                               |
 +-----------------------------------------------------------------------+
 |                                                                       |
 |                            Nombres alatoires                         |
 |                                                                       |
 +-----------------------------------------------------------------------*/

/* ---------------------------------------- Naturel alatoire
  entre :
  a = naturel de longueur la

  sortie :
  a <- chiffres alatoires
*/

/*
  Sous Linux-i386, RAND_MAX = 2^31 - 1.
  Sur la machine beaune de l'Inria, RAND_MAX = 2^15-1 ... et [man random]
  indique que random retourne 31 bits, ce qui est confirm exprimentalement.

  Je suppose que de manire gnrale, RAND_MAX = 2^x - 1 avec x >= 31.
  Si x >= HW on peut utiliser directement le rsultat de random(),
  sinon on calcule HW bits alatoires avec deux ou quatre appels  random()

  Pour garantir une identit de rsultats entre les diffrents modes,
  on tire un nombre pair de chiffres lorsque chiffres_per_long = 2.
*/

#ifdef RAND_MAX
#if RAND_MAX < 0x7fffffff
#undef RAND_MAX
#define RAND_MAX 0x7fffffff
#endif
#else
#define RAND_MAX 0x7fffffff
#endif

#if RAND_MAX >= (BASE_2) + (BASE_2-1)
void xn(random)(chiffre *a, long la) {
  long i;
  for (i=0; i < la; a[i++] = random());
#if chiffres_per_long == 2
  if (la&1) random();
#endif
}

#elif RAND_MAX >= (BASE_2 >> (HW/2-1)) - 1
void xn(random)(chiffre *a, long la) {
  long i;
  chiffre mask = ((chiffre)1<<(HW/2)) - 1;
  for (i=0; i < la; a[i++] = (random() & mask) + ((chiffre)(random()) << (HW/2)));
#if chiffres_per_long == 2
  if (la&1) {random(); random();}
#endif
}

#elif RAND_MAX >= (BASE_2 >> (3*HW/4-1)) - 1
void xn(random)(chiffre *a, long la) {
  long i;
  chiffre mask = ((chiffre)1<<(HW/4)) - 1, c;
  for (i=0; i < la; i++) {
      c = random() & mask;
      c = (c << (HW/4)) + (random() & mask);
      c = (c << (HW/4)) + (random() & mask);
      c = (c << (HW/4)) + (random() & mask);
      a[i] = c;
  }
#if chiffres_per_long == 2
  if (la&1) {random(); random(); random(); random();}
#endif
}

#else
#error "unexpected small value for RAND_MAX"
#endif