一个具体的例子。
如果我的范围是 1-300,如何使用 GUID "EDAAE218-FBF0-4B66-AEAF-FB036FBF69F4"
在该范围内生成 5 个唯一数字。 将相同的算法应用于 GUID 应导致每次选择相同的 5 个数字。
输入不必是 GUID,它只是充当某种键。
我试图解决的问题的一些背景。我有一个硬编码的值列表,其中包含大约 300 个左右的元素。我正在尝试找到一种方法来从此列表中选择始终产生相同元素的 20 个元素。
我的想法是生成一个可以分发给多个用户的 GUID。当这些用户将 GUID 输入到应用中时,将为每个人返回相同的 20 个元素。
guid 实际上是一个 128 位数字。因此,只要表示数字所需的位数少于 guid 中的位数 (128(,则可以轻松执行此操作。您不需要对 guid 或类似的东西进行哈希处理。
编辑:
现在我知道你需要什么(即从 guid 派生的唯一种子,你可以这样做( - 但你同样可以分发一个 32 位数字并避免 guid 到 int 的转换。
编辑2:根据上面评论中的建议使用GetHashCode。
编辑3:生成唯一编号。
static void Main(string[] args)
{
var guid = new Guid("bdc39e63-5947-4704-9e12-ec66c8773742");
Console.WriteLine(guid);
var numbers = FindNumbersFromGuid(guid, 16, 8);
Console.WriteLine("Numbers: ");
foreach (var elem in numbers)
{
Console.WriteLine(elem);
}
Console.ReadKey();
}
private static int[] FindNumbersFromGuid(Guid input,
int maxNumber, int numberCount)
{
if (numberCount > maxNumber / 2) throw new ArgumentException("Choosing too many numbers.");
var seed = input.GetHashCode();
var random = new Random(seed);
var chosenSoFar = new HashSet<int>();
return Enumerable.Range(0, numberCount)
.Select(e =>
{
var ret = random.Next(0, maxNumber);
while (chosenSoFar.Contains(ret))
{
ret = random.Next(0, maxNumber);
}
chosenSoFar.Add(ret);
return ret;
}).ToArray();
}