线性同余算法,涉及2个参数:seed = seed * a + b
参数a、b分别取什么值,算法的随机效果最好呢?
delphi以及最常用的c的随机函数都是:a=0x08088405,b=1
为什么它们才会随机效果最好呢?就像des算法里的参数,为什么现在采用的才是加密效果(混得最乱,最难反推)最好的呢?
随机数
├生成算法
│└线性同余
│  ├seed=(seed*0x08088405)+1
│  └ret=int64(dword(seed))*imax shr 32
└验证算法
  └NIST SP800-22标准中16种检验方法
    ├频数检验
    ├块内频数检验
    ├游程检验
    ├块内最长游程检验
    ├二元矩阵秩检验
    ├离散傅立叶变换检验
    ├非重叠模板匹配检验
    ├重叠模板匹配检验
    ├Maurer的通用统计检验
    ├Lempel-Ziv压缩检验
    ├线性复杂度检验
    ├序列检验
    ├近似熵检验
    ├累加和检验
    ├随机游动检验
    └随机游动状态频数检验
上面列的16种检验方法,有现成的检测代码吗?
需要生成连续几百兆的伪随机数内容到文件,给专门的检测工具取检测?

解决方案 »

  1.   

    莫非delphi-er都不关注随机算法?
    需要改发到什么版?vc版??
      

  2.   

    Delphi 下有个 Random ,在采集大量数据后,用 Excel 画一下点分布图。
    结果可以看到,覆盖面并不均匀,就像瘌痢头,东一块西一块的。
    这个就是伪随机数。
    事实上,在 VC,VB 等一系列工具下,都得的都是这个样子。
      

  3.   

    画点分别图,倒是一个好主意!虽然只能人员判断试了一下,在500x500的位图里画300000个随机点,感觉还是挺随机的
    虽然不完全平均,但是也相当分散了另外,随便设a、b,效果好像也差不多!
    当然,a很容易导致结果点固定为几个点或有规律的线条
      

  4.   

    seed = seed * a + b
    a=134775807,b=1,seed=1225时,30万个点 非常有规律(波浪型)如果以seed mod 500后的结果作为画点的坐标,则都是非常有规律的栅格!
    seed不是会遍历所有的整数int32范围的?很多a、b的结果都是如此
    a如果是偶数,很容易出现结果点反复重复
      

  5.   

    差一下C的随机数,
    http://topic.csdn.net/t/20061216/16/5235342.html
    其实有两个随机函数的。
    rand 直接就是伪随机,就不要考虑了。
    可以试试 srand 是不是能达到 lz 的意思。
      

  6.   

    有本《Applied Cryptography》的书,里面专门有一章谈伪随机算法的,网上应该不难找到吧
      

  7.   


    srand?好像就是以指定的种子生成一个随机数?这样也是伪随机,因为种子无法随机——一般是取系统时间的精确到毫秒甚至更低数值作为种子,因为它是“相当”不确定的
    但是,a和b其实已经决定了整个输出序列,虽然序列的周期是4G,对于很多应用,已经足够大,大到以为是“随机”的了加密是使用到随机,如rsa,不过好像没有专门的随机性优劣比较,只是提供一个算法而已
    guid,也是一样,它应该也是“伪”唯一,否则,使用它的md5值作为种子,应该比较“随机”了
    只是,一般的随机算法的种子只需要32位
      

  8.   

    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();
                    label1.Text = ra.Next(0,50).ToString();
                    label3.Text = ra.Next(0,50).ToString();
                     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(1, 50).ToString(); d = Convert.ToInt32(label1.Text) / Convert.ToDouble(label3.Text);  break;
                    }
                    
                    
                  
                }        
            }
            private void button1_Click(object sender, EventArgs e)
            {
                if(Convert.ToDouble(d.ToString("f5"))!=d)
                    label10.Text = label1.Text + label2.Text + label3.Text + "=" + d.ToString("f3");
                else
                    label10.Text = label1.Text + label2.Text + label3.Text + "=" + d.ToString();
                label10.ForeColor = Color.IndianRed;
                textBox1.Clear();
                textBox1.Focus();
                label1.Text = ra.Next(0, 50).ToString();
                label3.Text = ra.Next(0, 50).ToString();            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(1, 50).ToString(); d = Convert.ToInt32(label1.Text) / Convert.ToDouble(label3.Text); break;
                }          
                      }        private void button2_Click(object sender, EventArgs e)
            {
                Application.Exit();
            }
            int v;
            private void button3_Click(object sender, EventArgs e)
            {
                v++;
                if (v % 2 != 0)
                    label8.Visible = true;
                else
                    label8.Visible = false;
            }        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
            {
                 File.WriteAllText(@"C:\Documents and Settings\io\桌面\新建 写入.txt",label8.Text );
               
            }           }}
      

  9.   

    Delphi 下有个 Random ,在采集大量数据后,用 Excel 画一下点分布图。
    结果可以看到,覆盖面并不均匀,就像瘌痢头,东一块西一块的。
    这个就是伪随机数。
    事实上,在 VC,VB 等一系列工具下,都得的都是这个样子。
      

  10.   

    我想问一问如用multiple recursive PRNG的例子
    s0至s2,t0至t2先给定好
    s3= (s1 * a - s0 * b) % c
    t3= (t2 * d - t0 * e) % f
    seed= (s3-t3)% g
    这样的应该如何实现?效果如何?
      

  11.   


    没有用到t1和s2啊?
    这3行代码是第一次生成种子时候执行的,还是每生成一个随机数都执行?我后来搜到prng的c和delphi的代码,但是好像两者不一致
    delphi的是:
     * RRAND RNG - Ruptor's Fast True Random Number Generator, v2.0 based on aeRUPT
     * http://cryptolib.com/crypto/rrand
     * Copyright (c) 1992-2007 Marcos el Ruptor
     * Ported to Delphi by Alexander Myasnikov, 24-12-2008
     * Web: www.darksoftware.narod.ru
     * E-mail: [email protected]的是:
     * prng.c - Portable, ISO C90 and C99 compliant high-quality
     * pseudo-random number generator based on the alleged RC4
     * cipher.  This PRNG should be suitable for most general-purpose
     * uses.  Not recommended for cryptographic or financial
     * purposes.  Not thread-safe. 
      

  12.   


    真的是非常针对!谢谢!!
    昆斯的书啊,还好有中译版,而且csdn就有下载的,而且是不扣分下载!
    http://d.download.csdn.net/down/529863/yangchun301
      

  13.   

    随机数,
    http://topic.csdn.net/t/20061216/16/5235342.html
    其实有两个随机函数的。
      

  14.   

    粗粗翻了这一章,专门讲随机数,非常好!
    只是绝大多数公式、证明基本没看,主要是看不懂,而且扫描的pdf,很多小字(偏偏是关键的下标)看不清但是,他的几个结论的确是一锤定音:
    最好 a%8==5 !
    且 a>(2^32)/100 and a<(2^32)*99/100
    b不能与(2^32)有公因子
    生成(2^32)/1000个伪随机数后,最好换一个a
      

  15.   

    有本《Applied Cryptography》的书,里面专门有一章谈伪随机算法的,
      

  16.   


    应该是每次都执行
    比如说第10000个随机数就r10000是由(s10000-t10000)%g得出的,
    其中s10000= (s9998 * a - s9997 * b) % c
    t10000= (t9999 * d - t9997 * e) % f
    得来的。
    我想了好久,也没想清楚怎么去实现这玩意
      

  17.   

    DES算法里的参数,是经过反复验证的,通过扩散和混淆使密匙的影响最大,至于随机数,有一些之所以好是因为没有证据表明它不好
      

  18.   

    drbg检查伪随机数,需要128兆已生成的数据。
      

  19.   

    可以参考Symbian证书的产生过程.
      

  20.   

    “最随机”……蛋疼- -...
    随便转了篇...
    http://www.newsmth.net/bbsanc.php?path=%2Fgroups%2Fsci.faq%2FScience%2F6%2Fmath%2Fgailv1%2Fsuijiguocheng%2FM.1176097547.n0