C# 除某些给定数字外的随机数生成

C# 除某些给定数字外的随机数生成,c#,random,C#,Random,我正在为我正在创建的CMS搜索一个主键,该主键不能按升序或降序排列,所以我决定使用随机数 我想用随机数作为主键,因为可能有重复的数字;可以给出下一个随机生成中不应该出现的数字数组吗 我没有使用任何数据库。您可以尝试Guid: string guid = Guid.NewGuid().ToString("N"); 从msdn: GUID是一个128位整数(16字节),可以在需要唯一标识符的所有计算机和网络中使用。这样的标识符被复制的概率非常低 一个有趣的反对计数和专业Guid的方法。您可以尝试G

我正在为我正在创建的CMS搜索一个主键,该主键不能按升序或降序排列,所以我决定使用随机数

我想用随机数作为主键,因为可能有重复的数字;可以给出下一个随机生成中不应该出现的数字数组吗


我没有使用任何数据库。

您可以尝试
Guid

string guid = Guid.NewGuid().ToString("N");
从msdn:

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


一个有趣的反对计数和专业Guid的方法。

您可以尝试
Guid

string guid = Guid.NewGuid().ToString("N");
从msdn:

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


一个有趣的问题是反对计数和pro-guid。

我不得不说,如果您不使用数据库,我建议使用文本文件。文本文件中只有一个值-计数器-代码如下所示:

lock (_lockObj)
{
    var cntr = Convert.ToInt32(File.ReadAllText("path to counter file"));
    var newKey = cntr;
    cntr++
    File.WriteAllText("path to counter file", cntr.ToString());
}
其中,
\u lockObj
在类作用域中声明如下:

private readonly object _lockObj = new Object();
这里需要注意的是,您从中获取计数器的类必须是,因为您不希望有多个
\u lockObj



另一方面,如果您要在用户之间共享该类,您将希望通过所有用户共享的服务(例如web服务)访问该类因此,当您锁定文件时,它们都锁定在同一个锁定对象上,因此彼此等待。

如果您不使用数据库,我建议使用文本文件。文本文件中只有一个值-计数器-代码如下所示:

lock (_lockObj)
{
    var cntr = Convert.ToInt32(File.ReadAllText("path to counter file"));
    var newKey = cntr;
    cntr++
    File.WriteAllText("path to counter file", cntr.ToString());
}
其中,
\u lockObj
在类作用域中声明如下:

private readonly object _lockObj = new Object();
这里需要注意的是,您从中获取计数器的类必须是,因为您不希望有多个
\u lockObj



另一方面,如果您要在用户之间共享该类,您将希望通过所有用户共享的服务(例如web服务)访问该类,以便当您锁定文件时,所有用户都锁定同一个锁定对象,从而相互等待。

是否使用数据库(我强烈推荐),或者文本文件,或者其他一些,检查新密钥和使用过的密钥是有问题的;这一点一开始不会有问题,因为您使用过的密钥很少。但是,如果您添加了很多数字,验证新密钥将需要更多的时间,因为需要比较的密钥会更多

首先,您可以通过一次生成所有密钥来解决此问题,并在每次使用密钥时删除已使用的密钥(或将它们标记为已使用)

不必详细说明细节:例如,您可以在一个表中生成50万行(或更多行),并包括一个行号、一个主键和一个将行标记为“已使用”的字段。当您需要一个新键时,从随机行中选择主键,并将该行标记为已使用(或删除,如果您愿意)


如果您使用文本文件,您也可以这样做,确保在运行过程中删除每个“拾取的”行。

无论您使用的是数据库(我强烈建议),或文本文件,或其他内容时,会出现将新密钥与使用的密钥进行检查的问题;这在一开始不会是问题,因为您将没有多少使用过的密钥。但是,如果您添加了大量数字,验证新密钥将花费更多的时间,因为将有更多的密钥进行比较

首先,您可以通过一次生成所有密钥来解决此问题,并在每次使用密钥时删除已使用的密钥(或将它们标记为已使用)

不必详细说明细节:例如,您可以在一个表中生成50万行(或更多行),并包括一个行号、一个主键和一个将行标记为“已使用”的字段。当您需要一个新键时,从随机行中选择主键,并将该行标记为已使用(或删除,如果您愿意)


如果使用文本文件,也可以这样做,确保删除每个“拾取的”行。

如果您使用的是MYSQL数据库,如果使用自动增量,将永远不会有两个相等的PK。据我所知,您可以创建一个方法,生成一个随机数,并在传递或生成另一个随机数之前对照先前生成的数的列表进行检查。使用随机化器(如果设置的大小较小,则经常发生冲突)不是获得PK的好方法-如果使用数据库,则使用自动生成的密钥-如果没有,则利用文件中的计数器,在读写时锁定该计数器。让数据库处理唯一性!您肯定不如它的开发人员好。如果不使用数据库,则使用GUID作为唯一标识符…这只是abo同样,为什么不使用guid呢?对您来说,guid可能是随机的;)如果您使用的是MYSQL数据库,那么如果您使用Auto-increment,将永远不会有两个相等的PK。据我所知,您可以创建一个方法,生成一个随机数,并在传递或生成另一个之前将其与以前生成的数的列表进行检查。使用随机化器(如果设置的大小较小,则经常发生冲突)不是获得PK的好方法-如果使用数据库,则使用自动生成的密钥-如果没有,则利用文件中的计数器,在读写时锁定该计数器。让数据库处理唯一性!您肯定不如它的开发人员好。如果不使用数据库,则使用GUID作为唯一标识符…这只是abo同样的,为什么不使用guid呢?对你来说,可能已经足够随机了;)在哪个数字上