在C中怎么按时间和随机数来生成唯一不重复的定单号

2021-01-26 11:19:33 字数 7388 阅读 9608

1楼:匿名用户

这个稳定的解决办法是利用数据库来实现的。

如果是sql server可以利用自增长类型

如果是oracle 可以利用sequence

如何让c#产生不重复的随机数

2楼:匿名用户

“随机数 和 不重复 是相悖的两个概念”。因此这个问题理论上无解。

随机数,(一般c#中)指的是随机生成的一个整型或者浮点型数字。

不重复,指的是在一个数组中,每个元素都有唯一性。

(我们比方说,要生成10个不重复的随机数)

如果在一个范围内生成多个随机数, 那么肯定是会有生成“重复”的几率, 如果要做到不重复,1、要么每次生成时,对范围进行重新判定,

2、要么是生成后,比对已生成的数据,如果相同就重新生成。

无论哪一种做法,都可以实现“生成一组看似随机的不重复数据”,但是这个不能叫“随机数”。

1、的做法是指定新范围,从边界规避掉重复的可能性,所以这一组10个数据其实取值范围是不同的,因为不能叫做“同一组随机数”。

2、的做法其实是会生成重复随机数的, 只是我们把它过滤掉了,因此也不是“不重复随机数”。

所以这个问题如果不去钻牛角尖,有这么两种简单做法去实现,如果严谨的去**,其实是个悖论。

3楼:暖兰菲

要不重复的话,就用guid类把

guid g = guid.newguid(); //创建一个guid的对象

console.writeline(g.tostring());//然后tostring() 你用控制台输出看看,这种随机产生的十六进制数字,会重复的几率几乎没有。

4楼:匿名用户

static double buf = 0.5;

private static double ran()while (math.abs(num - buf) < 0.000001);

buf = num;

return (num);

}//0.00001表示接近于0的实数(伊普斯龙)//主程序调用 ran()即可,例如: r=ran();

***************===分割线********************

如果程序较小:可以如下

private static double ran()

5楼:匿名用户

如果你的随机数是整数,那么不可能不重复。随机数的产生次数,超过了整数的范围,必然会出现重复。如果不考虑范围的问题,每次产生随机数后,把它记下来,用于检查下次随机数是否重复。

如果不是整数,你可以用guid来避免重复

c# 如何生成不重复的1-100随机数。

6楼:匿名用户

有两种思路:1、随机生成一个1-100的数,然后判断重复,如果重复再生成一次;

2、创建一个数组,元素内容为1-100,对元素随机排序。

请参考下面的**

public void generaterandomnums()value = rand.next(1, 21);

if (!list.contains(value))}foreach (int temp in list).", temp);}}

第二种思路:

int a = ;

int b = a.orderby(x => guid.newguid()).toarray();

foreach (int v in b)

console.writeline(v);

console.readkey();

7楼:阳光的雷咩咩

randomr=newrandom();

intnums=enumerable.range(1,100)

.orderby(x=>r.next()).toarray();

foreach(intninnums)console.writeline(n);

.*** 下用c#产生一个永不重复10位随机数

8楼:叙事诗鞍悄

我们在做能自动生成试卷的考试系统时,常常需要随机生成一组不重复的题目,在.***

framework中提供了一个专门用来产生随机数的类system.random。

对于随机数,大家都知道,计算机不可能产生完全随机的数字,所谓的随机数发生器都是通过

一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟完全随机数,这

种随机数被称作伪随机数。伪随机数是以相同的概率从一组有限的数字中选取的。所选数字并

不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了。伪随机数的选择是从随

机种子开始的,所以为了保证每次得到的伪随机数都足够地“随机”,随机种子的选择就显得

非常重要。如果随机种子一样,那么同一个随机数发生器产生的随机数也会一样。一般地,我

们使用同系统时间有关的参数作为随机种子,这也是.*** framework中的随机数发生器默认采

用的方法。

我们可以使用两种方式初始化一个随机数发生器:

第一种方法不指定随机种子,系统自动选取当前时间作为随机种子:

random ro = new random();

第二种方法可以指定一个int型参数作为随机种子:

int iseed=10;

random ro = new random(10);

long tick = datetime.now.ticks;

random ran = new random((int)(tick & 0xffffffffl) | (int) (tick >> 32));

这样可以保证99%不是一样。

之后,我们就可以使用这个random类的对象来产生随机数,这时候要用到random.next()方

法。这个方法使用相当灵活,你甚至可以指定产生的随机数的上下限。

不指定上下限的使用如下:

int iresult;

iresult=ro.next();

下面的**指定返回小于100的随机数:

int iresult;

int iup=100;

iresult=ro.next(iup);

而下面这段**则指定返回值必须在50-100的范围之内:

int iresult;

int iup=100;

int idown=50;

iresult=ro.next(idown,iup);

除了random.next()方法之外,random类还提供了random.nextdouble()方法产生一个范

围在0.0-1.0之间的随机的双精度浮点数:

double dresult;

dresult=ro.nextdouble();

但是用random类生成题号,会出现重复,特别是在数量较小的题目中要生成不重复的的题目

是很难的,参考了网上的一些方法,包括两类,一类是通过随机种子入手,使每一次的随机种

子不同,来保证不重复;第二类是使用一些数据结构和算法。下面主要就第二类介绍几个方

法。方法1:思想是用一个数组来保存索引号,先随机生成一个数组位置,然后把这个位置的索引号

取出来,并把最后一个索引号复制到当前的数组位置,然后使随机数的上限减一,具体如:先

把这100个数放在一个数组内,每次随机取一个位置(第一次是1-100,第二次是1-99,...),

将该位置的数用最后的数代替。

int index = new int[15];

for (int i = 0; i < 15; i++)

index = i;

random r = new random();

//用来保存随机生成的不重复的10个数

int result = new int[10];

int site = 15;//设置下限

int id;

for (int j = 0; j < 10; j++)

方法2:利用hashtable。[nextpage]

hashtable hashtable = new hashtable();

random rm = new random();

int rmnum = 10;

for (int i = 0; hashtable.count < rmnum; i++)

}方法3:递归,用它来检测生成的随机数是否有重复,如果取出来的数字和已取得的数字有重复就重新随机获取。

random ra=new random(unchecked((int)datetime.now.ticks));

int arrnum=new int[10];

int tmp=0;

int minvalue=1;

int maxvalue=10;

for (int i=0;i<10;i++)

.........

.........

public int getnum(int arrnum,int tmp,int minvalue,int maxvalue,random ra)

n++;

}return tmp;}

9楼:当爱依成传说

使用guid的哈希码作为种子值,就不会重复了,**如下:

public class randomhelper{///

///生成制定位数的随机码(数字)

/////////

10楼:幻想武士

说的比较笼统!

永不重复10位随机数

?包括数字和字母?

11楼:匿名用户

思路:可以用随机数加时间的方法,这样绝对不会重复

c# winfrom 随机生成5个在0 到50直接的随机数,切不重复,怎么实现啊

12楼:斩光_者

主要函数:

publiclistgetnum()

else

else}}

returnresult;}

13楼:匿名用户

random r = new random();

dictionarydic = new dictionary();

while (dic.count + 1 < 6)这个不是正态随机

c#中,怎么产生一个随机数?

14楼:匿名用户

.***.frameword中提供了一个专门产生随机数的类system.

random,此类默认情况下已被导入,编程过程中可以直接使用。我们知道,计算机并不能产生完全随机的数字,它生成的数字被称为伪随机数,它是以相同的概率从一组有限的数字中选取的,所选的数字并不具有完全的随机性,但就实用而言,其随机程度已经足够了。

可以用以下两种方法初始化一个随机数发生器;

函数是这样用,比如100至999的随机数

random ran=new random();

int randkey=ran.next(100,999);

不过这样会有重复,可以给random一个系统时间做为参数,以此产生随机数,就不会重复了

第一种方法不指定随机种子,系统自动选取当前时前作随机种子:

random ra=new random();

第二种方法是指定一个int型的参数作为随机种子:

int iseed=6;

random ra=new random(iseed);

下面我们要用到random.next()方法产生随机数。

ra.next();

它返回一个大于或等于零而小于2,147,483,647的数,这并不满足我们的需要,下面我们介绍它的重载函数和其它一些方法。

public virtual int next(int);

用法:ra.next(20)

返回一个小于所指定最大值(此处为20)的正随机数。

public virtual int next(int minvalue, int maxvalue);

用法:ra.next(1,20)

返回一个指定范围内(此处为1-20之间)的随机数,我们在下面的实例中会用到此函数。

类system.random还有几个方法分别是:

公共方法:

nextbytes用随机数填充指定字节数组的元素。

nextdouble返回一个介于 0.0 和 1.0 之间的随机数。

受保护的方法:

sample返回一个介于 0.0 和 1.0 之间的随机数,只允许子类对象访问。

以上介绍了随机数的基本用法,下面我们用一个实例来做更进一步的介绍。要在一段数字区间内随机生成若干个互不相同的随机数,比如在从1到20间随机生成6个互不相同的整数。

主要是下面两个函数getrandomnum与getnum:

public int getrandomnum(int num,int minvalue,int maxvalue)

return arrnum;

}getrandomnum即是在区间[minvalue,maxvalue]取出num个互不相同的随机数,返回的数组包含着结果。

其中随机数是这样创建的 random ra=new random(unchecked((int)datetime.now.ticks));为什么不用random ra=new random();(系统自动选取当前时前作随机种子)

用系统时间做随机种子并不保险,如果应用程序在一个较快的计算机上运行,则该计算机的系统时钟可能没有时间在此构造函数的调用之间进行更改,random 的不同实例的种子值可能相同。这种情况下,我们就需要另外的算法来保证产生的数字的随机性。所以为了保证产生的随机数足够"随机",我们不得不使用复杂一点的方法来获得随机种子。

在上面的这段程序中,我们首先使用系统时间作为随机种子,然后将上一次产生的随机数跟循环变量和一个与系统时间有关的整型参数相乘,以之作为随机种子,从而得到了每次都不同的随机种子,保证了产生足够"随机"的随机数。

函数getnum是一递归,用它来检测生成的随机数是否有重复,如果取出来的数字和已取得的数字有重复就重新随机获取。值得注意的是要用一同一个随机数实例生成,所以ra要作为参数传入getnum中,否则生成的数字会有重复。

public int getnum(int arrnum,int tmp,int minvalue,int maxvalue,random ra)

n ;}

return tmp;

}最后就是要显示出来,当点击一个button时取出的数字显示在一个label中。

private void button1_click(object sender, system.eventargs e)

label1.text=temp; //显示在label1中}