【问题标题】:attempting to create string of random values试图创建一串随机值
【发布时间】:2011-04-03 11:32:23
【问题描述】:

我正在尝试生成一个随机长度的字符串,该字符串由随机 chars 组成。

为此,我有以下代码:

class Program
{
    static void Main(string[] args)
    {
        for (int i = 0; i < 1000; i++)
        {
            MyString test = new MyString();

            test.Random();
            Console.WriteLine(test.Value);
        }
        Console.ReadLine();
    }
}

public class MyString
{
    private string value = string.Empty;
    private Random r = new Random();

    public string Value
    {
        get { return this.value; }
        set { this.value = value; }
    }

    public void Random()
    {
        int length = (r.Next() % (100)) + 1;
        for(int i = 0; i < length; i++)
        {
            value = value + RandomChar();
        }  
    }

    public char RandomChar()
    {
        // 32 to 126
        int c = (r.Next() % 95) + 32;
        char ch = (char)c;
        return ch;
    }
}

现在,让我们看一下输出的一部分:

如您所见,输出远非随机,它包含大量重复的字符串。这怎么可能,我该如何解决?

【问题讨论】:

  • 这就是随机性,你永远无法知道它是否不是随机的。
  • 这张图片很难看懂。
  • Random.Next 有 3 个重载,您至少应该对其中一个感兴趣:msdn.microsoft.com/en-us/library/13td4hz1.aspx
  • @NullUserException:不管是否是面无表情的幽默,有一些方法可以获得足够的分布/独立性,我们不在乎区分随机和难以预测。

标签: c# string random


【解决方案1】:

每次调用MyString 构造函数时,您似乎都在创建Random 类的 实例。 Random 类可能会根据当前时间(以某种分辨率)为自己播种。以相同值作为种子的随机数生成器将生成相同的伪随机序列。

解决方案是构造 一个 Random 的实例并在任何地方使用它。

【讨论】:

  • 好答案。来自文档:“但是,由于时钟的分辨率有限,因此使用无参数构造函数连续创建不同的 Random 对象会创建生成相同随机数序列的随机数生成器。” msdn.microsoft.com/en-us/library/system.random.aspx
  • +1 作为一种快速解决方法,请考虑将您的 Random 实例设为静态 - 因为只有一个 Random 实例,它可能会改变字符的分布。
  • @r0h:只是不要在密码学场景中使用它。不过,对于测试代码来说可能很棒。
【解决方案2】:

http://msdn.microsoft.com/en-us/library/system.io.path.getrandomfilename.aspx

string randomName = Path.GetRandomFileName();
randomName = randomName.Replace(".", string.Empty);

// take substring...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 2023-03-15
    • 2021-12-11
    • 1970-01-01
    相关资源
    最近更新 更多