使用VS2005 C#编写随机数Random算法的代码(适用于连续产生随机数,重置后不适用)
2009-03-04 15:17
686 查看
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Collections;
namespace RandomFunction
...{
public partial class Random : Form
...{
public Random()
...{
InitializeComponent();
}
private void btnExit_Click(object sender, EventArgs e)
...{
Application.Exit();
}
static UInt64 next = 1;
//从同一个种子开始
private int PeRandom( )
...{
next = next * 1103515245 + 12345;
return (UInt16)(next / 65536) % 32768;
}
private void btnRandom_Click(object sender, EventArgs e)
...{
int input_MaxNum;
int output_num;
//输入随机数的范围 0 --- input_MaxNum
input_MaxNum = int.Parse(inputRandom.Text);
output_num = this.PeRandom();
try
...{
listOutput.Items.Add(output_num % input_MaxNum);
}
catch (System.ApplicationException ex)
...{
Console.WriteLine(ex.Message);
}
}
private void btnClr_Click(object sender, EventArgs e)
...{
listOutput.Items.Clear();
}
}
}
下面这段代码是随机函数的核心部分:
next = next * 1103515245 + 12345;
return (UInt16)(next / 65536) % 32768;
读者可以尝试着把1103515245,12345替换掉,也会产生随机数,next / 65536相当于把next向右移16位,然后% 32768,因此取值范围在(0--32767)之间。
细心的朋友发现每次第一次产生的数其实未必随机,都是固定的,只是后面每个数不一样罢了。因此这种随机算法受到了局限,很多随机函数还与时间函数相关联,这样只要不在同一时刻产生的数就不会一样了,当然精确到毫秒级别同一时刻是相对困难的。
故,以上算法适用与连续不断产生随机数的需求,如果系统重置,每次重置所产生的随机数是相同的,这一点需要注意。
源代码下载处:
http://download.csdn.net/source/334547
c/cpp中可以产生随机种子,在用rand函数,就避免了重复
srand((unsigned)time(NULL));
rand();
相关文章推荐
- 使用VS2005 C#编写随机数Random算法的代码
- 编写高质量代码改善C#程序的157个建议——建议134:有条件地使用前缀
- 编写高质量代码改善C#程序的157个建议——建议136:优先使用后缀表示已有类型的新版本
- 编写高质量代码改善C#程序的157个建议——建议150:使用匿名方法、Lambda表达式代替方法
- 使用EditPlus2编写C#代码
- VS2005 Addin续--编写C#代码统计插件
- 【飞秋】使用C# 4编写动态的代码
- 编写高质量代码改善C#程序的157个建议——建议79:使用ThreadPool或BackgroundWorker代替Thread
- 编写高质量代码改善C#程序的157个建议——建议84:使用PLINQ
- 初识c# 随机数产生及库类中常用字符串函数使用
- 编写高质量代码改善C#程序的157个建议[正确操作字符串、使用默认转型方法、却别对待强制转换与as和is]
- 编写高质量代码改善C#程序的157个建议——建议19:使用更有效的对象和集合初始化
- 【Unity&C#&随机数】如何产生连续不重复的随机数
- 编写高质量代码改善C#程序的157个建议——建议35:使用default为泛型类型变量指定初始值
- 编写高质量代码改善C#程序的157个建议——建议37:使用Lambda表达式代替方法和匿名方法
- 编写高质量代码改善C#程序的157个建议——建议40:使用event关键字为委托施加保护
- 编写高质量代码改善C#程序的157个建议——建议56:使用继承ISerializable接口更灵活地控制序列化过程
- 编写高质量代码改善C#程序的157个建议——建议5: 使用int?来确保值类型也可以为null
- 编写高质量代码改善C#程序的157个建议——建议118:使用SecureString保存密钥等机密字符串
- 编写高质量代码改善C#程序的157个建议——建议151:使用事件访问器替换公开的事件成员变量