如何使用一个注入随机数从一个种子

本文关键字:一个 种子 随机数 注入 何使用 | 更新日期: 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();            
    }