我想生成0和某個整數之間的(僞)隨機數。我不介意他們是不是太隨意了。我可以訪問一天中的當前時間,但不能訪問rand函數。任何人都可以想到一個足夠強大的方法來產生這些?也許,從一天中的某個時刻丟棄一些數據,並取模我的整數或什麼?如何在不使用rand()函數的情況下生成隨機數字?
我正在使用c。
我想生成0和某個整數之間的(僞)隨機數。我不介意他們是不是太隨意了。我可以訪問一天中的當前時間,但不能訪問rand函數。任何人都可以想到一個足夠強大的方法來產生這些?也許,從一天中的某個時刻丟棄一些數據,並取模我的整數或什麼?如何在不使用rand()函數的情況下生成隨機數字?
我正在使用c。
如果你是一個超簡單的僞隨機生成後,你可以只使用一個Linear Feedback shift Register。
維基百科的文章有一些代碼片段讓你看看,但基本上是一個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);
}
正是我需要的!一個非常簡單和優雅的解決方案 – AnkurVj
看看你自己的實現僞隨機生成器(什麼是「內部」rand()
),例如Mersenne twister受到高度重視。
這樣做的唯一「健壯」(不容易預測)的方式是編寫自己的僞隨機數生成器,並用當前時間播種。強制性維基百科鏈接:http://en.wikipedia.org/wiki/Pseudorandom_number_generator
你可以得到「微小的梅森難題」在這裏:http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/TINYMT/index.html
是純C,簡單易用。例如。只是使用時間:
#include "tinymt32.h"
// And if you can't link:
#include "tinymt32.c"
#include <time.h>
#include <stdio.h>
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));
}
對於「不太隨機」的整數,你可以從當前的UNIX時間開始,然後使用遞歸公式r = ((r * 7621) + 1) % 32768;
。在第n次迭代之後,在0
(含)和M
(不含)之間的第n個隨機整數將是r % M
。
這被稱爲線性同餘發生器。
遞歸公式是bzip2用於在其快速排序實現中選擇樞軸。我不知道其他的目的,但它工作得很好了這個特殊的...
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
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<x;i++)
printf("%d ",(a[i]%r)+1);
free(a);
getch();
return 0;
}
您能給我們帶來一個解釋你的代碼嗎!並請閱讀[如何寫出一個好答案](http://stackoverflow.com/help/how-to-answer) – eliasah
下面的程序產生的隨機數,而不使用蘭特機能的研究
#include<stdio.h>
#include<time.h>
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;
}
如果您不希望序列總是以相同的值開始,您可能可以獲得設置開始值的時間。
有人可以解釋倒票嗎? – 12431234123412341234123
這聽起來像作業。如果是這樣,你應該用「家庭作業」標籤標記它。 – jadarnel27
如果您有權訪問google.com,請嘗試搜索:「random number generator」。 – DwB
爲什麼不直接從'/ dev/random'讀取?或者使用xkcd方法。 – 2011-09-29 20:21:18