【问题标题】:How can I have a random number without having the same [closed]如何在没有相同的情况下获得随机数[关闭]
【发布时间】:2018-04-27 18:34:23
【问题描述】:

我的问题是,当我想为我的数据库创建一个 id 时,我会为此生成一个随机数,但不好的是它会重复。

public void Iniciar()
{
    Random r = new Random();
    int prevnum = -1;

    for (int loop = 0; loop < 10; loop++)
    {
        do
        {
            num = r.Next(1000,9999);
        } while (num == prevnum);

        prevnum = num;
    }
}

【问题讨论】:

  • 为什么不让数据库生成id?
  • 那是因为 random 并不意味着 unique。随机性不以任何方式依赖于先前的状态。 "1, 1, 1, 1, 1" 是一个完全有效的 5 个随机数序列。你到底想做什么?
  • Echo'ing @RonBeyer,了解你想要做什么会很好,但从表面上看,你应该让你的数据库处理这个用例——除非你有什么原因不相信它应该
  • 我猜你可能想要洗一些数字,比如创建一个 1 到 100 的列表,然后洗它们,就像它们是卡片一样。可能是这样吗?否则,您需要跟踪以前的数字(这不是一件好事)或使用唯一的 GUID,但它们不是数字。

标签: c# asp.net


【解决方案1】:

如果您只是寻找唯一 ID(并且不需要整数),则可以使用 UUID:

String id = Guid.NewGuid().ToString()

如果你需要一个唯一的整数ID,你最好使用你的数据库来生成它们(比如mysql的AUTO_INCREMENT

【讨论】:

  • 信不信由你,虽然它的碰撞几率很低,但不能保证 Guid 是唯一的。
【解决方案2】:

简单地说:你不能,直接。

System.Random 可以一遍又一遍地生成相同的数字。如果您仍然想获得“唯一随机”数字,则需要将生成的数字存储在列表中,然后检查新生成的数字是否在列表中。

using System;
using System.Collections.Generic;

class Program
{
    public static int Main(string[] args)
    {
        var numbers = new List<int>();
        Random rnd = new Random();
        for (int n = 0; n < 20; n++)
        {
            int num = rnd.Next(1000, 9999);
            for (int i = 0; i < numbers.Count; i++)
            {
                if (num == numbers[i])
                {
                    while (num == numbers[i])
                        num = rnd.Next(1000, 9999);
                    i = -1;
                }
            }
            numbers.Add(num);
        }
        // Uncomment if you want sorting
        // numbers.Sort();
        // Print numbers so we can check that every entry is unique
        for (int i = 0; i < numbers.Count; i++)
            Console.WriteLine("Id: {0}", numbers[i]);
        return 0;
    }
}

如果之前生成了相同的数字,此代码将尝试生成随机数,然后重新启动以使用列表检查数字。相当低效,并且不能很好地处理“边缘”数字。 (例如您尝试生成一个只有 19 个随机数的 20 个条目列表)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-10
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-27
    相关资源
    最近更新 更多