如何在没有rand()函数的情况下生成随机数?

我想生成介于0和某个整数之间的(伪)随机数。 我不介意他们是不是太随意。 我可以访问当天的当前时间,但不能访问randfunction。 任何人都可以想到一种足够强大的方法来生成这些吗? 也许,从一天中的某个时间丢弃一些比特并取模数我的整数或其他东西?

我在用c。

如果您使用的是超简单的伪随机生成器,则可以使用线性反馈移位寄存器 。

维基百科文章有一些代码片段供您查看,但基本上16位生成器的代码看起来像这样(从该页面轻轻按摩……)

  unsigned short lfsr = 0xACE1u; unsigned bit; unsigned rand() { bit = ((lfsr >> 0) ^ (lfsr >> 2) ^ (lfsr >> 3) ^ (lfsr >> 5) ) & 1; return lfsr = (lfsr >> 1) | (bit << 15); } 

对于“不太随机”的整数,可以从当前的UNIX时间开始,然后使用递归公式r = ((r * 7621) + 1) % 32768; 。 在第n次迭代之后, 0 (包括)和M (不包括)之间的第n个随机整数将是r % M .

这称为线性同余生成器。

递归公式是bzip2在其快速排序实现中用于选择枢轴的内容。 我不知道其他目的,但它对这个特别的一个很好…

看看你自己实现了一个伪随机生成器(什么是“内部” rand() ),例如Mersenne twister是备受推崇的。

唯一“强大”(不易预测)的方法是编写自己的伪随机数生成器并将其与当前时间一起播种。 必须的维基百科链接: http : //en.wikipedia.org/wiki/Pseudorandom_number_generator

你可以在这里找到“Tiny Mersenne Twister”: http : //www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/TINYMT/index.html

它纯粹,易于使用。 例如,只是使用时间:

 #include "tinymt32.h" // And if you can't link: #include "tinymt32.c" #include  #include  int main(int argc, const char* argv[]) { tinymt32_t state; uint32_t seed = time(0); tinymt32_init(&state, seed); for (int i=0; i<10; i++) printf("random number %d: %u\n", i, (unsigned int)tinymt32_generate_uint32(&state)); } 

下面以完整的工作示例提供了与范围一起工作的最小且简单的随机发生器

 unsigned int MyRand(unsigned int start_range,unsigned int end_range) { static unsigned int rand = 0xACE1U; /* Any nonzero start state will work. */ /*check for valid range.*/ if(start_range == end_range) { return start_range; } /*get the random in end-range.*/ rand += 0x3AD; rand %= end_range; /*get the random in start-range.*/ while(rand < start_range){ rand = rand + end_range - start_range; } return rand; } int main(void) { int i; for (i = 0; i < 0xFF; i++) { printf("%u\t",MyRand(10,20)); } return 0; } 

程序下面生成随机数,不使用randfunction

 #include #include int main() { int num; time_t sec; sec=time(NULL); printf("Enter The Number\n"); scanf("%d",&num); if(num>0) { for(;;) { sec=sec%3600; if(num>=sec) { printf("%ld\n",sec); break; } sec=sec%num; } } else { printf("Please Enter Positive Value\n\n\n*****Thanks For Visit*****\n\n\n"); } return 0; } 

可能是有用的

一个最简单的随机数生成器,它不会返回相同的值:

 uint16_t simpleRand(void) { static uint16_t r = 5531; //dont realy care about start value r+=941; //this value must be relative prime to 2^16, so we use all values return r; } 

如果您不希望序列始终以相同的值启动,您可以花时间设置起始值。

 #include #include #include int main() { unsigned int x,r,i; // no of random no you want to generate scanf("%d",&x); // put the range of random no scanf("%d",&r); unsigned int *a=(unsigned int*)malloc(sizeof(unsigned int)*x); for(i=0;i