MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
ut0rnd.cc
Go to the documentation of this file.
1 /*****************************************************************************
2 
3 Copyright (c) 1994, 2009, Oracle and/or its affiliates. All Rights Reserved.
4 
5 This program is free software; you can redistribute it and/or modify it under
6 the terms of the GNU General Public License as published by the Free Software
7 Foundation; version 2 of the License.
8 
9 This program is distributed in the hope that it will be useful, but WITHOUT
10 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
11 FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
12 
13 You should have received a copy of the GNU General Public License along with
14 this program; if not, write to the Free Software Foundation, Inc.,
15 51 Franklin Street, Suite 500, Boston, MA 02110-1335 USA
16 
17 *****************************************************************************/
18 
19 /***************************************************************/
26 #include "ut0rnd.h"
27 
28 #ifdef UNIV_NONINL
29 #include "ut0rnd.ic"
30 #endif
31 
34 #define UT_RANDOM_1 1.0412321
35 #define UT_RANDOM_2 1.1131347
36 #define UT_RANDOM_3 1.0132677
37 
40 UNIV_INTERN ulint ut_rnd_ulint_counter = 65654363;
41 
42 /***********************************************************/
46 UNIV_INTERN
47 ulint
49 /*==========*/
50  ulint n)
51 {
52  ulint pow2;
53  ulint i;
54 
55  n += 100;
56 
57  pow2 = 1;
58  while (pow2 * 2 < n) {
59  pow2 = 2 * pow2;
60  }
61 
62  if ((double) n < 1.05 * (double) pow2) {
63  n = (ulint) ((double) n * UT_RANDOM_1);
64  }
65 
66  pow2 = 2 * pow2;
67 
68  if ((double) n > 0.95 * (double) pow2) {
69  n = (ulint) ((double) n * UT_RANDOM_2);
70  }
71 
72  if (n > pow2 - 20) {
73  n += 30;
74  }
75 
76  /* Now we have n far enough from powers of 2. To make
77  n more random (especially, if it was not near
78  a power of 2), we then multiply it by a random number. */
79 
80  n = (ulint) ((double) n * UT_RANDOM_3);
81 
82  for (;; n++) {
83  i = 2;
84  while (i * i <= n) {
85  if (n % i == 0) {
86  goto next_n;
87  }
88  i++;
89  }
90 
91  /* Found a prime */
92  break;
93 next_n: ;
94  }
95 
96  return(n);
97 }