#include <stdio.h> #include <stdlib.h> #include <string.h> // 一个随机数生成函数 // 此函数不是基于用线性同余法(标准库中的rand()基于此方法), // 而是以一个Knuth提出的相减方法为基础,速度比标准库中的rand()要快,但不标准。 static long g_next = -1; //设定seed为任意负数值作为种子。 void randomseed(long seed) { if (seed > 0) seed = -seed; g_next = seed; } //返回0.0~1.0之间的随机数,设定idum为任意负数值 float randomunit() { static int next, nextp; static int iff = 0; static int ma[56]; static const int MBIG = 1000000000, MSEED = 161803398, MZ = 0; static const float FAC = (1.0/MBIG); int i, ii, k, mj, mk; if (g_next < 0 || iff == 0) //初始赋值 { iff = 1; mj = labs(MSEED-labs(g_next)); mj %= MBIG; ma[55] = mj; mk = 1; for(i=1;i<=54;i++) { ii = (21*i) % 55; ma[ii] = mk; mk = mj-mk; if (mk < int(MZ)) mk += MBIG; mj = ma[ii]; } for(k=0; k<4; ++k) for(i=1; i<=55; ++i) { ma[i] -= ma[1+(i+30) % 55]; if (ma[i] < int(MZ)) ma[i] += MBIG; } next = 0; nextp = 31; g_next = 1; } //除初始化外,在此处开始 if (++next == 56) next = 1; if (++nextp == 56) nextp = 1; mj = ma[next]-ma[nextp]; if (mj < int(MZ)) mj += MBIG; ma[next] = mj; return mj*FAC; } int random(int low, int high) { return int((high-low)*randomunit()+low); } // 测试 int main() { int i,j; int map[128][128]; memset(map,0,sizeof(map)); for (i=0;i<1000;i++) { map[random(0, 128)][random(0, 128)]=1; } // 生成图片,将输出重定向到一个.pbm文件即可 printf("P1/n128 128/n"); for (i=0;i<128;i++) { for (j=0;j<128;j++) { printf("%d ",map[i][j]); } printf("/n"); } return 0; } |
一个随机数生成函数
最新推荐文章于 2021-01-12 22:16:08 发布