什么样参数的伪随机数算法,才是最随机的?该怎么处理

什么样参数的伪随机数算法,才是最随机的?
线性同余算法,涉及2个参数:seed = seed * a + b
参数a、b分别取什么值,算法的随机效果最好呢?
delphi以及最常用的c的随机函数都是:a=0x08088405,b=1
为什么它们才会随机效果最好呢?

就像des算法里的参数,为什么现在采用的才是加密效果(混得最乱,最难反推)最好的呢?


Delphi(Pascal) code
随机数
├生成算法
│└线性同余
│  ├seed=(seed*0x08088405)+1
│  └ret=int64(dword(seed))*imax shr 32
└验证算法
  └NIST SP800-22标准中16种检验方法
    ├频数检验
    ├块内频数检验
    ├游程检验
    ├块内最长游程检验
    ├二元矩阵秩检验
    ├离散傅立叶变换检验
    ├非重叠模板匹配检验
    ├重叠模板匹配检验
    ├Maurer的通用统计检验
    ├Lempel-Ziv压缩检验
    ├线性复杂度检验
    ├序列检验
    ├近似熵检验
    ├累加和检验
    ├随机游动检验
    └随机游动状态频数检验

上面列的16种检验方法,有现成的检测代码吗?
需要生成连续几百兆的伪随机数内容到文件,给专门的检测工具取检测?

------解决方案--------------------
Delphi 下有个 Random ,在采集大量数据后,用 Excel 画一下点分布图。
结果可以看到,覆盖面并不均匀,就像瘌痢头,东一块西一块的。
这个就是伪随机数。
事实上,在 VC,VB 等一系列工具下,都得的都是这个样子。
------解决方案--------------------
有本《Applied Cryptography》的书,里面专门有一章谈伪随机算法的,网上应该不难找到吧
------解决方案--------------------
我来推荐一下。
------解决方案--------------------
额~~求解
------解决方案--------------------
可以获取当前用户的鼠标指针位置然后计算得到,这样的结果不是伪随机数,
我记得好像(某种)证书用的加密方法就是需要用户移动鼠标位置得到的随机数然后计算的,的确比较"随机"
或者从用户那里得到其他的人所产生的数,然后计算随机,我觉得应该也会好一些
我对之也不是很了解,只是自己的一点见解而已
------解决方案--------------------
C语言C++都有的,我现在有个C#的,给大家,这个程序的任务是自动生成加减算术。下面是完整代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.IO;

namespace 随机数字
{
 
public partial class Form1 : Form
{
double y;
private SqlConnection con = null;
private SqlCommand cmd=null;
private SqlDataAdapter dapt=null;
private DataSet ds=null;

Random ra = new Random();
int a;
string ss;
double d;
int a2;
public Form1()
{

InitializeComponent();
label8.Visible = false;




label1.Text = ra.Next(0,50).ToString();
label3.Text = ra.Next(0,50).ToString();
int a = ra.Next(50) % 4;
switch (a)
{
case 0: label2.Text = "+"; d=Convert.ToInt32(label1.Text)+Convert.ToInt32(label3.Text);break;
case 1: label2.Text = "-";d=Convert.ToInt32(label1.Text)-Convert.ToInt32(label3.Text); break;
case 2: label2.Text = "×";d=Convert.ToInt32(label1.Text)*Convert.ToInt32(label3.Text); break;
case 3: label2.Text = "/";label3.Text = ra.Next(0, 50).ToString(); d = Convert.ToInt32(label1.Text) / Convert.ToDouble(label3.Text); break;
}





}
int w=0;

private void textBox1_TextChanged(object sender, EventArgs e)
{

if (textBox1.Text == d.ToString("f3") || textBox1.Text == d.ToString())
{
a2 += 10;
label7.Text = "得分:" + a2;
w++;
label8.Text += "\n第" + w + "题: " + label1.Text + label2.Text + label3.Text +"="+ textBox1.Text ;
label7.ForeColor = Color.Red;
textBox1.Clear();