⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rand.c

📁 File system using stacked.
💻 C
字号:
/* code for rand(3), copied directly from libc *//* Copyright (C) 1991, 1996 Free Software Foundation, Inc.   This file is part of the GNU C Library.   The GNU C Library 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 GNU C 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 C Library; if not, write to the Free   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA   02111-1307 USA.  */#undef	rand#define	DEG_3		31#define	TYPE_3		3#define	TYPE_0		0#define	SEP_3		3#define int32_t intstruct random_data  {    int32_t *fptr;              /* Front pointer.  */    int32_t *rptr;              /* Rear pointer.  */    int32_t *state;             /* Array of state values.  */    int rand_type;              /* Type of random number generator.  */    int rand_deg;               /* Degree of random number generator.  */    int rand_sep;               /* Distance between front and rear.  */    int32_t *end_ptr;           /* Pointer behind state table.  */  };static int32_t randtbl[DEG_3 + 1] =  {    TYPE_3,    -1726662223, 379960547, 1735697613, 1040273694, 1313901226,    1627687941, -179304937, -2073333483, 1780058412, -1989503057,    -615974602, 344556628, 939512070, -1249116260, 1507946756,    -812545463, 154635395, 1388815473, -1926676823, 525320961,    -1009028674, 968117788, -123449607, 1284210865, 435012392,    -2017506339, -911064859, -370259173, 1132637927, 1398500161,    -205601318,  };static struct random_data unsafe_state =  {/* FPTR and RPTR are two pointers into the state info, a front and a rear   pointer.  These two pointers are always rand_sep places aparts, as they   cycle through the state information.  (Yes, this does mean we could get   away with just one pointer, but the code for random is more efficient   this way).  The pointers are left positioned as they would be from the call:	initstate(1, randtbl, 128);   (The position of the rear pointer, rptr, is really 0 (as explained above   in the initialization of randtbl) because the state table pointer is set   to point to randtbl[1] (as explained below).)  */    .fptr = &randtbl[SEP_3 + 1],    .rptr = &randtbl[1],/* The following things are the pointer to the state information table,   the type of the current generator, the degree of the current polynomial   being used, and the separation between the two pointers.   Note that for efficiency of random, we remember the first location of   the state information, not the zeroth.  Hence it is valid to access   state[-1], which is used to store the type of the R.N.G.   Also, we remember the last location, since this is more efficient than   indexing every time to find the address of the last element to see if   the front and rear pointers have wrapped.  */    .state = &randtbl[1],    .rand_type = TYPE_3,    .rand_deg = DEG_3,    .rand_sep = SEP_3,    .end_ptr = &randtbl[sizeof (randtbl) / sizeof (randtbl[0])]};int__random_r (buf, result)     struct random_data *buf;     int32_t *result;{  int32_t *state;  if (!buf || !result)    goto fail;  state = buf->state;  if (buf->rand_type == TYPE_0)    {      int32_t val = state[0];      val = ((state[0] * 1103515245) + 12345) & 0x7fffffff;      state[0] = val;      *result = val;    }  else    {      int32_t *fptr = buf->fptr;      int32_t *rptr = buf->rptr;      int32_t *end_ptr = buf->end_ptr;      int32_t val;      val = *fptr += *rptr;      /* Chucking least random bit.  */      *result = (val >> 1) & 0x7fffffff;      ++fptr;      if (fptr >= end_ptr)	{	  fptr = state;	  ++rptr;	}      else	{	  ++rptr;	  if (rptr >= end_ptr)	    rptr = state;	}      buf->fptr = fptr;      buf->rptr = rptr;    }  return 0; fail://  __set_errno (EINVAL);  return -1;}long int__random (){  int32_t retval;//  __libc_lock_lock (lock);  (void) __random_r (&unsafe_state, &retval);//  __libc_lock_unlock (lock);  return retval;}/* Return a random integer between 0 and RAND_MAX.  */int rand () {  return (int) __random ();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -