线性同余算法,涉及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种检验方法,有现成的检测代码吗?
需要生成连续几百兆的伪随机数内容到文件,给专门的检测工具取检测?
参数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种检验方法,有现成的检测代码吗?
需要生成连续几百兆的伪随机数内容到文件,给专门的检测工具取检测?
解决方案 »
- 求MS SQL Server 2000 数据分页及數據操作控制的解決方案!
- delphi7.0读写加了密码的access2002生成的access2000数据库的问题
- 怎样用Drawing Grid画一个标准的个人简历表??并在输入的地方嵌入一些编辑控件??
- 对比两个图片。
- 如何获得窗体句柄
- 唉!又是拦截getprocaddress的问题!大家来帮看看先!
- 用Delphi编写的OCX控件如何读Web传来的参数?
- 100分求助,数据导出问题。。。
- 招Delphi程序员:有意者速联系[email protected]
- webbrowser打开网页并登录后,再手动打开IE却未登录状态;反之亦然。
- DELPHI从数据库导出DOC文档
- 调用 PrinterSetupDialog设置完打印机属性后,如何立即生效
需要改发到什么版?vc版??
结果可以看到,覆盖面并不均匀,就像瘌痢头,东一块西一块的。
这个就是伪随机数。
事实上,在 VC,VB 等一系列工具下,都得的都是这个样子。
虽然不完全平均,但是也相当分散了另外,随便设a、b,效果好像也差不多!
当然,a很容易导致结果点固定为几个点或有规律的线条
a=134775807,b=1,seed=1225时,30万个点 非常有规律(波浪型)如果以seed mod 500后的结果作为画点的坐标,则都是非常有规律的栅格!
seed不是会遍历所有的整数int32范围的?很多a、b的结果都是如此
a如果是偶数,很容易出现结果点反复重复
http://topic.csdn.net/t/20061216/16/5235342.html
其实有两个随机函数的。
rand 直接就是伪随机,就不要考虑了。
可以试试 srand 是不是能达到 lz 的意思。
srand?好像就是以指定的种子生成一个随机数?这样也是伪随机,因为种子无法随机——一般是取系统时间的精确到毫秒甚至更低数值作为种子,因为它是“相当”不确定的
但是,a和b其实已经决定了整个输出序列,虽然序列的周期是4G,对于很多应用,已经足够大,大到以为是“随机”的了加密是使用到随机,如rsa,不过好像没有专门的随机性优劣比较,只是提供一个算法而已
guid,也是一样,它应该也是“伪”唯一,否则,使用它的md5值作为种子,应该比较“随机”了
只是,一般的随机算法的种子只需要32位
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 );
} }}
结果可以看到,覆盖面并不均匀,就像瘌痢头,东一块西一块的。
这个就是伪随机数。
事实上,在 VC,VB 等一系列工具下,都得的都是这个样子。
s0至s2,t0至t2先给定好
s3= (s1 * a - s0 * b) % c
t3= (t2 * d - t0 * e) % f
seed= (s3-t3)% g
这样的应该如何实现?效果如何?
没有用到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.
真的是非常针对!谢谢!!
昆斯的书啊,还好有中译版,而且csdn就有下载的,而且是不扣分下载!
http://d.download.csdn.net/down/529863/yangchun301
http://topic.csdn.net/t/20061216/16/5235342.html
其实有两个随机函数的。
只是绝大多数公式、证明基本没看,主要是看不懂,而且扫描的pdf,很多小字(偏偏是关键的下标)看不清但是,他的几个结论的确是一锤定音:
最好 a%8==5 !
且 a>(2^32)/100 and a<(2^32)*99/100
b不能与(2^32)有公因子
生成(2^32)/1000个伪随机数后,最好换一个a
应该是每次都执行
比如说第10000个随机数就r10000是由(s10000-t10000)%g得出的,
其中s10000= (s9998 * a - s9997 * b) % c
t10000= (t9999 * d - t9997 * e) % f
得来的。
我想了好久,也没想清楚怎么去实现这玩意
随便转了篇...
http://www.newsmth.net/bbsanc.php?path=%2Fgroups%2Fsci.faq%2FScience%2F6%2Fmath%2Fgailv1%2Fsuijiguocheng%2FM.1176097547.n0