如何使用一个注入随机数从一个种子
本文关键字:一个 种子 随机数 注入 何使用 | 更新日期: 2023-09-27 18:05:53
我想有一个完美哈希函数和随机数生成器之间的组合。
它将用于将1到5000之间的整数映射到1到5000之间的整数,并且它必须是内射的(没有两个输入可以有相同的输出,反之亦然)。
例如:INPUT OUTPUT
1 1542
2 73
3 4600
1000 201
2 73
1 1542
提前感谢。
编辑:我首先尝试使用维基百科中的几个哈希函数,但它们都有问题。
试试这样:
public class RandomHash
{
private readonly Dictionary<int, int> _mydictionary;
private List<int> _usedNumbers;
private readonly Random _rnd;
private readonly int _size;
public RandomHash(int size)
{
_mydictionary = new Dictionary<int, int>();
_usedNumbers = new List<int>();
_rnd = new Random(100); // magic seed
_size = size;
}
public int HashNumber(int num)
{
if (_mydictionary.ContainsKey(num))
return _mydictionary[num];
int n = _rnd.Next(1, _size);
while (n == num || _mydictionary.ContainsKey(n))
{
n = _rnd.Next(1, _size);
}
_mydictionary.Add(num, n);
return n;
}
}
这里的神奇之处在于,我用一个常数100
来播种Random类。这保证了相同的数字将散列到相同的"随机"数字。像这样使用:
static void Main(string[] args)
{
var rh = new RandomHash(5000);
Console.WriteLine(rh.HashNumber(1));
Console.WriteLine(rh.HashNumber(2));
Console.WriteLine(rh.HashNumber(3));
Console.WriteLine(rh.HashNumber(1000));
Console.WriteLine(rh.HashNumber(2));
Console.WriteLine(rh.HashNumber(1));
Console.WriteLine();
}