【问题标题】:How can I generate random variables according to data types?如何根据数据类型生成随机变量?
【发布时间】:2019-07-29 02:14:55
【问题描述】:

我有一些数据库和表格。我正在尝试检测每一列的数据类型并根据数据类型创建随机变量?


例如:

col1 : int
col2 : nvarchar(max)
col3 : bit

我需要检测代码中的每种数据类型并为插入创建随机变量。

我应该为此工作创建一个检查所有数据类型并生成变量的方法吗?喜欢:

if(datatype.Equals("int"))
   random.Next();
else if(datatype.Equals("string"))
   ...

有什么简单的方法吗?


【问题讨论】:

  • 我正在使用 MSSQL。
  • 另外,你对“随机”的定义是什么?也许对于 int 它可能是“显而易见的”(例如,所有可能值的均匀分布),但对于字符串,您可能想要限制和定义更多。您是否应该先确定随机长度,然后再确定随机字符?哪些随机字符,您是否限制自己使用字母?到所有 unicode 字符? GUID ?
  • 我做了一些搜索,我想我需要确定字符和长度。这是正确的。但我只是想了解是否有任何简单的方法可以做到这一点。该解决方案必须适用于字符串、整数、位、日期时间等...如果不是,那么我想我必须为所有数据类型一一创建自己的算法。
  • 没有通用的方法来做到这一点。虽然您显然可以生成一些随机位模式,然后将它们重新解释为某种类型的实例(尽管这在 .NET 中并不容易做到!)但并非所有位模式都对所有类型都有效。除了完全随机数据的所有其他明显问题(即,它不能代表您的应用程序将处理的实际数据)之外,仅这一点就足以说明为什么需要特殊套管。生成虚拟数据的第三方解决方案有多种,但此评论太窄,无法包含它们。

标签: c# sql .net sql-server random


【解决方案1】:

没有内置“SQL Server数据类型->.NET数据类型”映射表;因此,您必须自己进行映射。

您可以查看SQL Server to .Net type conversions

【讨论】:

    【解决方案2】:

    Random 类提供Random.Next()Random.NextBytes()Random.NextDouble() 方法。 Random.Next() 方法返回一个随机数,Random.NextBytes() 返回一个填充了随机数的字节数组,Random.NextDouble() 返回一个介于 0.0 和 1.0 之间的随机数。

    Random.Next() 方法具有三种重载形式,允许您设置随机数的最小和最大范围。

    以下代码返回一个随机数。

    int num = random.Next();
    

    以下代码返回一个小于 1000 的随机数。

    int num = random.Next(1000);
    

    以下代码返回一个介于最小值和最大值范围之间的随机数。在两个数字之间生成一个随机数

    public int RandomNumber(int min, int max)  
    {  
        Random random = new Random();  
        return random.Next(min, max);  
    }
    

    您甚至可以结合使用 RandomNumber 和 RandomString 这两种方法来生成随机字符串和数字的组合。

    // Generate a random string with a given size  
    public string RandomString(int size, bool lowerCase)  
    {  
        StringBuilder builder = new StringBuilder();  
        Random random = new Random();  
        char ch;  
        for (int i = 0; i < size; i++)  
        {  
            ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));  
            builder.Append(ch);  
        }  
        if (lowerCase)  
            return builder.ToString().ToLower();  
        return builder.ToString();  
    }
    

    Reference

    要了解映射,请关注Link

    使用GetType() 方法了解C# 中的数据类型。你可以了解一下Here

    【讨论】:

    • 对每个方法调用都执行Random random = new Random(); 是可怕的,因为如果你快速连续调用该方法,你将得到相同的“随机”结果。使用在方法之外某处声明的Randomone(线程)静态实例来规避该问题。另请参阅来自Jon SkeetEric Lippert 的关于Random 的想法。
    【解决方案3】:

    这是一种方法:

    var random = new Random();
    var factory = new Dictionary<Type, Func<object>>()
    {
        { typeof(int), () => random.Next() },
        { typeof(string), () =>
            {
                var bytes = new byte[16];
                random.NextBytes(bytes);
                return Convert.ToBase64String(bytes);
            }
        },
        { typeof(DateTime), () => DateTime.Now.AddDays((random.NextDouble() - 0.5) * 100) },
    };
    

    那么你可以这样做:

    var datatype = typeof(string);
    var output = factory[datatype]();
    Console.WriteLine(output);
    

    我得到eyqQ1EdMDTsR8Ny8kS73Hg== 作为示例输出。

    您只需要继续构建您需要的所有类型。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-20
      • 2020-06-29
      • 2011-03-31
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      • 2021-03-23
      相关资源
      最近更新 更多