这个答案是一个 wiki。我正在开发一个 .NET 中的库和示例,您可以随意添加您自己的任何语言...
如果没有外部“随机”输入(例如监控街道噪音),作为确定性机器,计算机无法生成真正的随机数:Random Number Generation。
由于我们大多数人没有资金和专业知识来使用特殊设备来提供混乱的输入,因此有一些方法可以利用您的操作系统、任务调度程序、进程管理器和用户输入(例如鼠标运动),以产生改进的伪随机性。
不幸的是,我对 C++ TR1 的了解还不够,不知道它是否有能力做到这一点。
编辑
正如其他人所指出的,通过使用不同的输入播种 RNG,您会得到不同的数字序列(最终会重复,因此它们不是真正随机的)。因此,您有两种选择来改进您的一代:
定期使用某种混乱的输入重新植入您的 RNG,或者根据您的系统运行方式使您的 RNG 的输出不可靠。
前者可以通过创建算法来完成,这些算法通过检查系统环境来明确产生种子。这可能需要设置一些事件处理程序、委托函数等。
后者可以通过较差的并行计算实践来实现:即设置许多 RNG 线程/进程以“不安全的方式”竞争以创建每个后续随机数(或数字序列)。这隐含地从系统上的活动总和中增加了混乱,因为每分钟的事件都会影响到哪个线程的输出最终被写入并最终在调用“GetNext()”类型方法时被读取。下面是 .NET 3.5 中的粗略概念证明。注意两点:1)即使RNG每次都以相同的数字作为种子,但不会创建24个相同的行; 2) 性能受到显着影响,资源消耗明显增加,这是改进随机数生成时给定的:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace RandomParallel
{
class RandomParallel
{
static int[] _randomRepository;
static Queue<int> _randomSource = new Queue<int>();
static void Main(string[] args)
{
InitializeRepository(0, 1, 40);
FillSource();
for (int i = 0; i < 24; i++)
{
for (int j = 0; j < 40; j++)
Console.Write(GetNext() + " ");
Console.WriteLine();
}
Console.ReadLine();
}
static void InitializeRepository(int min, int max, int size)
{
_randomRepository = new int[size];
var rand = new Random(1024);
for (int i = 0; i < size; i++)
_randomRepository[i] = rand.Next(min, max + 1);
}
static void FillSource()
{
Thread[] threads = new Thread[Environment.ProcessorCount * 8];
for (int j = 0; j < threads.Length; j++)
{
threads[j] = new Thread((myNum) =>
{
int i = (int)myNum * _randomRepository.Length / threads.Length;
int max = (((int)myNum + 1) * _randomRepository.Length / threads.Length) - 1;
for (int k = i; k <= max; k++)
{
_randomSource.Enqueue(_randomRepository[k]);
}
});
threads[j].Priority = ThreadPriority.Highest;
}
for (int k = 0; k < threads.Length; k++)
threads[k].Start(k);
}
static int GetNext()
{
if (_randomSource.Count > 0)
return _randomSource.Dequeue();
else
{
FillSource();
return _randomSource.Dequeue();
}
}
}
}
只要在生成过程中有用户输入/交互,此技术将产生不可破解的、非重复的“随机”数字序列。在这种情况下,知道机器的初始状态不足以预测结果。