srandom ( ) 和 random ( ) 【C语言库函数源代码】

C语言库函数源代码】

【本程序在Dev C++ 4.9.9.2 下编译通过】

/*

   这两个函数也是C库中产生随机数的程序。你需要先

   使用srandom()函数赋随机数种子值。然后再使用

   random()函数来产生随机数。是对srand()和rand()

   这两个函数的改良,用法也很类似。现在的这个代码

   仅仅是实现了随机数函数srand()和rand()的功能。

   在GCC库函数中要比现在的代码完全的多,另外可以

   指定其他的状态值,使得随机更完全。

*/

 

#define ULONG_MAX  ((unsigned long)(~0L)) /* 0xFFFFFFFF*/

#define LONG_MAX   ((long)(ULONG_MAX >> 1))/* 0x7FFFFFFF*/

 

#define NULL (void *) 0

 

static long int RandomTable[32] ={ 3,

      0x9a319039, 0x32d9c024, 0x9b663182, 0x5da1f342,

      0xde3b81e0, 0xdf0a6fb5, 0xf103bc02, 0x48f340fb,

      0x7449e56b, 0xbeb1dbb0, 0xab5c5918, 0x946554fd,

      0x8c2e680f, 0xeb3d799f, 0xb11ee0b7, 0x2d436b86,

      0xda672e2a, 0x1588ca88, 0xe369735d, 0x904f35f7,

      0xd7158fd6, 0x6fa6f051, 0x616e6b96, 0xac94efdc,

      0x36413f93, 0xc622c298, 0xf5a42ab8, 0x8a88d77b,

      0xf5ad9d0e, 0x8999220b, 0x27fb47b9

    };

 

static long int *fptr = &RandomTable[4];

static long int *rptr = &RandomTable[1];

static long int *state = &RandomTable[1];

static long int *end_ptr = &RandomTable[sizeof(RandomTable) / sizeof(RandomTable[0])];

 

long int my_random ()

{

   long int i;

   *fptr += *rptr;

 

   i = (*fptr >> 1) & LONG_MAX;

   fptr++;

   if (fptr >= end_ptr)

   {

      fptr = state;

      rptr++;

   }

   else

   {

      rptr++;

      if (rptr >= end_ptr)

        rptr = state;

   }

   return i;

}

void my_srandom (unsigned int seed)

{

   state[0] = seed;

   register long int i;

   for (i = 1; i < 31; ++i)

      state[i] = (1103515145 * state[i - 1]) + 12345;

   fptr = &state[3];

   rptr = &state[0];

   for (i = 0; i < 10 * 31; ++i)

      my_random();

}

 

#include <time.h>

int main()

{

   int i;

  

   my_srandom((unsigned)(time(NULL)));

   for(i=0;i<100;i++)

   {

      if(i % 10 == 0)

         printf("/n");

      printf("%d/t",my_random()%99+1);

   }

   system("pause");

   return 0;

}  

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在C语言中实现Permuted Congruential Generator(PCG)算法,可以使用PCG官方提供的C语言参考实现。以下是一个简单的示例代码: ```c #include <stdint.h> typedef struct { uint64_t state; uint64_t inc; } pcg32_random_t; void pcg32_srandom_r(pcg32_random_t* rng, uint64_t initstate, uint64_t initseq) { rng->state = 0U; rng->inc = (initseq << 1u) | 1u; pcg32_random_r(rng); rng->state += initstate; pcg32_random_r(rng); } uint32_t pcg32_random_r(pcg32_random_t* rng) { uint64_t oldstate = rng->state; rng->state = oldstate * 6364136223846793005ULL + rng->inc; uint32_t xorshifted = ((oldstate >> 18u) ^ oldstate) >> 27u; uint32_t rot = oldstate >> 59u; return (xorshifted >> rot) | (xorshifted << ((-rot) & 31)); } int main() { pcg32_random_t rng; pcg32_srandom_r(&rng, 42u, 54u); // 初始化随机数生成器 for (int i = 0; i < 10; ++i) { uint32_t random_num = pcg32_random_r(&rng); // 生成随机数 printf("%u\n", random_num); } return 0; } ``` 在此示例中,我们定义了一个`pcg32_random_t`结构体来保存PCG算法的状态和步长。`pcg32_srandom_r`函数用于初始化随机数生成器的状态和步长,而`pcg32_random_r`函数则用于生成随机数。 在`main`函数中,我们首先创建一个`pcg32_random_t`结构体并使用`pcg32_srandom_r`函数初始化它。然后,我们使用`pcg32_random_r`函数生成10个随机数并打印出来。 请注意,这只是一个简单的示例代码,实际应用中可能需要根据具体需求进行适当的修改。此外,PCG算法还有其他变体和参数设置可供选择,您可以根据需要进行相应的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值