使用Random的两个误区,兼散分帖~
昨天一朋友问了下我关于他写的一段程序的错误.
其中有一个问题就是关于随机数的.他的代码如下(C++代码).
for (int i =0;i< n;++i){ srand((unsigned)time( NULL )); int r = rand()%100; cout << r << ",";}
for (int i=0;i<n;++i){ var rnd = new Random (s);//s是实先确定的一个数字 Console.Write ("{0},",rnd.Next());}
for (int i=0;i<n;++i){ var rnd = new Random ();//用系统时间作为种子 Console.Write ("{0},",rnd.Next());}
var rnd = new Random ();//用系统时间作为种子for (int i=0;i<n;++i){ Console.Write ("{0},",rnd.Next());}
List<int> list=new List<int>();for(int i=0;i<100;i++){ int value=rnd.Next(1, 101); while(list.Contains(value)){ value=rnd.Next(1, 101);}list.Add(value);}
[解决办法]
搂主没错,的确是这样的,刚回了一个这样的贴,见下面贴:
http://topic.csdn.net/u/20081227/11/d47c3275-0e5d-4543-8e5a-0399a4c37880.html
6楼代码也是这样做的
[解决办法]
Mark
[解决办法]
写的不错,是这样
------解决方案--------------------
这个帖子一定要顶起来
[解决办法]
学习..UP
[解决办法]
[解决办法]
恩。
[解决办法]
C#里的随机数算法用的就是高德纳在《计算机程序设计艺术》里写的算法。
我以前遇到这个问题就是查了原版书才发现的。
[解决办法]
呵呵说得好。还有什么技巧啊
[解决办法]
学习了
[解决办法]
确实是这样的
[解决办法]
学习ing
还学习楼主分享精神!
[解决办法]
学习下
[解决办法]
路过,,把Random类代码帖出来…………
/* * Copyright (c) 2008 Microsoft::Tsorgy.Utils, Reserved. * * Filename: @(#)Random.cs * Create by: TsOrgY * Email: tsorgy@gmail.com * Date: 2008/12/27 15:01:40 * * Classname: Random * Description: 一种能够产生满足某些随机性统计要求的数字序列的设备. * */using System;using System.Runtime.InteropServices;namespace Tsorgy.Utils { /// <summary> /// 表示伪随机数生成器,一种能够产生满足某些随机性统计要求的数字序列的设备. /// </summary> [Serializable] [ComVisible(true)] public class Random { private int inext; private int inextp; private const int MBIG = 0x7fffffff; private const int MSEED = 0x9a4ec86; private const int MZ = 0; private int[] SeedArray; /// <summary> /// 使用与时间相关的默认种子值,初始化 Random 类的新实例. /// </summary> public Random() : this(Environment.TickCount) { } /// <summary> /// 使用指定的种子值初始化 System.Random 类的新实例. /// </summary> /// <param name="Seed">用来计算伪随机数序列起始值的数字。如果指定的是负数,则使用其绝对值。</param> /// <exception cref="System.OverflowException">Seed 为 System.Int32.MinValue,在计算其绝对值时会导致溢出。</exception> public Random(int Seed) { this.SeedArray = new int[0x38]; int num2 = 0x9a4ec86 - Math.Abs(Seed); this.SeedArray[0x37] = num2; int num3 = 1; for (int i = 1; i < 0x37; i++) { int index = (0x15 * i) % 0x37; this.SeedArray[index] = num3; num3 = num2 - num3; if (num3 < 0) { num3 += 0x7fffffff; } num2 = this.SeedArray[index]; } for (int j = 1; j < 5; j++) { for (int k = 1; k < 0x38; k++) { this.SeedArray[k] -= this.SeedArray[1 + ((k + 30) % 0x37)]; if (this.SeedArray[k] < 0) { this.SeedArray[k] += 0x7fffffff; } } } this.inext = 0; this.inextp = 0x15; Seed = 1; } private double GetSampleForLargeRange() { int num = this.InternalSample(); if ((((this.InternalSample() % 2) == 0) ? 1 : 0) != 0) { num = -num; } double num2 = num; num2 += 2147483646.0; return (num2 / 4294967293); } private int InternalSample() { int inext = this.inext; int inextp = this.inextp; if (++inext >= 0x38) { inext = 1; } if (++inextp >= 0x38) { inextp = 1; } int num = this.SeedArray[inext] - this.SeedArray[inextp]; if (num < 0) { num += 0x7fffffff; } this.SeedArray[inext] = num; this.inext = inext; this.inextp = inextp; return num; } /// <summary> /// 返回非负随机数. /// </summary> /// <returns>大于或等于零且小于 System.Int32.MaxValue 的 32 位带符号整数。</returns> public virtual int Next() { return this.InternalSample(); } /// <summary> /// 返回一个小于所指定最大值的非负随机数. /// </summary> /// <param name="maxValue">要生成的随机数的上界(随机数不能取该上界值)。maxValue 必须大于或等于零。</param> /// <returns>大于或等于零且小于 maxValue 的 32 位带符号整数,即:返回的值范围包括零但不包括 maxValue。</returns> /// <exception cref="System.ArgumentOutOfRangeException">maxValue 小于零。</exception> public virtual int Next(int maxValue) { if (maxValue < 0) { throw new ArgumentOutOfRangeException("maxValue", string.Format("'{0}' must be greater than zero.", maxValue)); } return (int) (this.Sample() * maxValue); } /// <summary> /// 返回一个指定范围内的随机数. /// </summary> /// <param name="minValue">返回的随机数的下界(随机数可取该下界值)。</param> /// <param name="maxValue">返回的随机数的上界(随机数不能取该上界值)。maxValue 必须大于或等于 minValue。</param> /// <returns>一个大于或等于 minValue 且小于 maxValue 的 32 位带符号整数,即:返回的值范围包括 minValue 但不包括 maxValue。如果minValue 等于 maxValue,则返回 minValue。</returns> /// <exception cref="System.ArgumentOutOfRangeException">minValue 大于 maxValue。</exception> public virtual int Next(int minValue, int maxValue) { if (minValue > maxValue) { throw new ArgumentOutOfRangeException("minValue", string.Format("'{0}' cannot be greater than {1}.", minValue, maxValue)); } long num = maxValue - minValue; if (num <= 0x7fffffffL) { return (((int) (this.Sample() * num)) + minValue); } return (((int) ((long) (this.GetSampleForLargeRange() * num))) + minValue); } /// <summary> /// 用随机数填充指定字节数组的元素. /// </summary> /// <param name="buffer">包含随机数的字节数组。</param> /// <exception cref="System.ArgumentNullException">buffer 为 null。</exception> public virtual void NextBytes(byte[] buffer) { if (buffer == null) { throw new ArgumentNullException("buffer"); } for (int i = 0; i < buffer.Length; i++) { buffer[i] = (byte) (this.InternalSample() % 0x100); } } /// <summary> /// 返回一个介于 0.0 和 1.0 之间的随机数. /// </summary> /// <returns>大于或等于 0.0 而小于 1.0 的双精度浮点数字。</returns> public virtual double NextDouble() { return this.Sample(); } /// <summary> /// 返回一个介于 0.0 和 1.0 之间的随机数. /// </summary> /// <returns>大于或等于 0.0 而小于 1.0 的双精度浮点数字。</returns> protected virtual double Sample() { return (this.InternalSample() * 4.6566128752457969E-10); } }}
[解决办法]
学习,以前也经常犯这样的错误
[解决办法]
总结的挺好
[解决办法]
经常看到这样的错误
[解决办法]
路过.
[解决办法]
Random ra = new Random();
MessageBox.Show("您今天的幸运数字是\n " + ra.Next(0, 99), "幸运数字", MessageBoxButtons.OK, MessageBoxIcon.Information);
哈哈
[解决办法]
学到不少
谢谢了
[解决办法]
非常好
[解决办法]
en
[解决办法]
MARKED
[解决办法]
up
[解决办法]
发布出去帖子。
[解决办法]
要定义种子啊
最常用的是用时间ticket做种
[解决办法]
fen,up
[解决办法]
mark
[解决办法]
不错~!
[解决办法]
谢谢~
[解决办法]
学习
[解决办法]
研究
[解决办法]
UP
[解决办法]
学习
[解决办法]
学习!
[解决办法]
真的不错唉。学习了。
[解决办法]
int store[] = new int[10]; boolean eq; //生成数组 IntegerSet() { for (int i = 0; i < store.length; i++) { for (int x = 20; x < 80; x++) { if (1 != (int) (Math.random() * 2) && this.checks(x, i) == false) { store[i] = x; } } } } //检测是否有重复项 boolean checks(int x, int i) { boolean ch = false; for (int j = 0; j < i; j++) { if (store[j] == x) { ch = true; } } return ch; }}
[解决办法]
顶下!
[解决办法]
o
[解决办法]
顶下!
[解决办法]
好 不错 学习学习
[解决办法]
不错,学习学习
[解决办法]
以前犯过一个比这个还麻烦的错误,现在基本就不出错了
[解决办法]
没犯过这样的错误,不过学习了~谢谢~~~~
[解决办法]
谢谢分享
[解决办法]
UP
[解决办法]
学习了!