我想知道每种编程语言中的随机函数是如何工作的,所以我想自己生成一个数字,即我不想使用任何内置的类或函数。
答案 0 :(得分:4)
如果你好奇它是如何运作的,你可以从维基百科开始:Random number generation和List of random number generators。第二个链接将为您提供一些您可以自己实现的流行算法(如Mersenne Twister)列表。
您还可以使用.Net Reflector反编译System.Random,并将给定的算法与.Net中原生实现的算法进行比较
另外,D. Knuth的Art of Computer Programming有一章关于随机数及其生成。
答案 1 :(得分:4)
为了简单和快速,很难击败Xorshift random number generator。它是否能产生良好的分布是另一个问题。
C#中的一个例子:http://www.codeproject.com/KB/cs/fastrandom.aspx
不同的语言和环境使用不同的随机数生成器。正如其他人所指出的,有很多方法可以生成伪随机数。
请参阅C# Normal Random Number和其他类似的Stack Overflow问题。
答案 2 :(得分:3)
正如其他人评论的那样,您真的希望依赖框架功能。如果这是出于学术目的或出于纯粹的兴趣,有许多RNG算法易于实现。一种是乘法携带(MWC)算法,可以在C#中轻松实现:
public class RNG
{
// Seeds
static uint m_w = 362436069; /* must not be zero */
static uint m_z = 521288629; /* must not be zero */
public int NextRandom()
{
m_z = 36969 * (m_z & 65535) + (m_z >> 16);
m_w = 18000 * (m_w & 65535) + (m_w >> 16);
return (int)((m_z << 16) + m_w);
}
}
有关MWC的详细信息,请参阅http://www.bobwheeler.com/statistics/Password/MarsagliaPost.txt
答案 3 :(得分:0)
不使用Random()方法生成随机数
using System;
public class GenerateRandom
{
private int max;
private int last;
static void Main(string[] args)
{
GenerateRandom rand = new GenerateRandom(10);
for (int i = 0; i < 25; i++)
{
Console.WriteLine(rand.nextInt());
}
}
// constructor that takes the max int
public GenerateRandom(int max)
{
this.max = max;
DateTime dt = DateTime.Now;//getting current DataTime
int ms = dt.Millisecond;//getting date in millisecond
last = (int) (ms % max);
}
// Note that the result can not be bigger then 32749
public int nextInt()
{
last = (last * 32719 + 3) % 32749;//this value is set as per our requirement(i.e, these is not a static value
return last % max;
}
}