我正在使用Visual Studio 2013、iis-8.5、.net 4.5.1
在我的项目中,我想创建8 digit unique number,它应该由中间的'hypen'和前缀"MNOP-"分隔。生成的8 digit应该继承Cryptography class。
我的代码
var bytes = new byte[4];
var rng = RandomNumberGenerator.Create();
rng.GetBytes(bytes);
int random = BitConverter.ToInt32(bytes, 0) % 100000000;
var data = "ABCD-" + random.ToString("####-####");我通过'for loop'创建了10000的值,但一些'random variable'返回负值
提前谢谢。
发布于 2016-02-02 01:40:07
您可以做以下三件事:
您不应该只使用随机数生成器,因为冲突的机会随着生成的数字数量的增加而迅速增加。这是因为生日问题。
这也意味着,如果你想生成大量的数字,解决方案1)是不合适的,因为它可能会停滞。假设您只剩下一个可用的数字,您有一个400MB的表,它正在尝试查找剩下的一个4字节的条目。其他选项需要分别存储表和偏移量,或者键和计数器。
您当前的生成方法是不平衡的,因为它比正数更容易生成较低的数字。此外,您应该重置最高有效位,因为ToInt32返回带符号的二进制补值,而%是余数运算符,而不是模运算符。
好的,仅限于这一次,一些C#代码,来庆祝我在平台上的青铜徽章:
namespace StackOverflow
{
class RandomIDGenerator
{
private const string FORMAT = "ABCD-####-####";
private const string TEST_FORMAT = "ABCD-###";
private RandomNumberGenerator rng = RandomNumberGenerator.Create();
private byte[] b = new byte[1];
private SortedSet<string> previousIDs = new SortedSet<string>();
private char GenerateRandomDigit()
{
int x;
do
{
rng.GetBytes(b);
x = b[0] & 0xFF;
} while (x >= 250);
int y = x % 10;
return (char) ('0' + y);
}
private String GenerateRandomID()
{
StringBuilder sb = new StringBuilder(TEST_FORMAT);
for (int i = 0; i < sb.Length; i++)
{
if (sb[i] == '#')
{
sb[i] = GenerateRandomDigit();
}
}
return sb.ToString();
}
public String GenerateUniqueRandomID()
{
string id;
do
{
id = GenerateRandomID();
}
while (previousIDs.Contains(id));
previousIDs.Add(id);
return id;
}
public static void Main(String[] args)
{
RandomIDGenerator gen = new RandomIDGenerator();
for (int i = 0; i < 500; i++)
{
Console.WriteLine(gen.GenerateUniqueRandomID());
}
Console.WriteLine("Put breakpoint here...");
foreach (string id in gen.previousIDs)
{
Console.WriteLine(id);
}
Console.WriteLine(gen.previousIDs.Count);
Console.WriteLine("Put breakpoint here...");
}
}
}https://stackoverflow.com/questions/35130195
复制相似问题