首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在C#中生成随机唯一数

问如何在C#中生成随机唯一数
EN

Stack Overflow用户
提问于 2010-06-18 03:20:15
回答 11查看 1.8K关注 0票数 5
代码语言:javascript
复制
public int GenPurchaseOrderNum()
{
    Random random = new Random();
    _uniqueNum = random.Next(13287, 21439);
    return UniqueNum;
}

我从db的PONumber列中删除了唯一约束,因为员工应该只在交易设置时生成P.O. #。否则,邮政信箱编号将为0。

采购订单编号过去具有唯一约束,这会强制员工在所有情况下生成采购订单,这样数据库就不会抛出唯一约束错误。

由于我删除了unique约束,所以任何没有P.O.的引用都将携带0值。否则,将为P.O. #生成唯一值。然而,我在db中没有唯一的约束,这使得我很难知道应用程序生成的P.O. #是否是唯一的。

我该怎么办?

我希望我的问题足够清楚。

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2010-06-18 03:30:12

GUID在开销方面有点高。具体地说,听起来您需要一个人类可读的PO#数字,这使得GUID不切实际。我更倾向于使用下面的场景。

  1. 删除字段上的任何非NULL约束。
  2. 有一个存储过程,您可以使用该存储过程创建新PO,使PO #字段为NULL。Null最适合上述情况,因为在DB的世界中,NULL表示“未知”,由于您实际上没有PO编号,因此它是未知的。
  3. 使用一个存储过程,该存储过程在交易完成时更新该字段,以递增到下一个可用的PO编号。这将发生在服务器端,因此更新来自哪个客户端并不重要,它对该表仍然是唯一的。然后,此存储过程可以将更新后的结果集(如果需要)返回给客户端,以便客户端可以看到新的PO #。

这就是两万英尺的视角。

票数 11
EN

Stack Overflow用户

发布于 2010-10-04 19:57:53

每次执行new Random()时,它都会被初始化。这意味着在一个紧凑的循环中,你会多次得到相同的值。您应该保留单个Random实例,并在同一实例上继续使用Next。

代码语言:javascript
复制
//Function to get random number
private static readonly Random getrandom = new Random();
private static readonly object syncLock = new object();
public static int GetRandomNumber(int min, int max)
{
    lock(syncLock) { // synchronize
        return getrandom .Next(min, max);
    }
}
票数 11
EN

Stack Overflow用户

发布于 2010-06-18 03:22:27

如果你真的想要一个随机值,而不是返回一个int,你可以使用GUID。这些保证是唯一的:

GUID是一个128位整数(16字节),可在需要唯一标识符的所有计算机和网络中使用。这样的标识符被复制的概率非常低。

Source

另一种方法是保留上一次使用的编号的记录,并在每次需要新的PO时简单地增加它。确保在它周围设置了锁,这样两个进程就不会同时尝试递增它。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3064881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档