1

我写的这个类是否足以(我的意思是专业人士的做法)包含在代码/项目中?还是我错过了重要的事情?我不知道如何使用构造函数等,所以我没有使用相同的(我只是 C# 的初学者),但如果需要,请发表评论。

using System;
using System.Collections.Generic;
using System.Text;

namespace RandBit
{
    /// <summary>
    /// By: Author
    /// Version 0.0.1
    /// Pseudo-Random 16-Bit (Max) Generator.
    /// </summary>
    public class RandomBit
    {
        /// <param name="input">The Bit-size(int)</param>
        /// <returns>Random Bit of Bit-size(string)</returns>
        public static string Generate(int input)
        {
            int bitSize = 0;
            Random choice = new Random();
            if (input == 0 || input > 16)
            {
                bitSize = 0;
            }
            else if (input == 1)
            {
                bitSize = 1;
            }
            else
            {
                int randomChoice = choice.Next(0, (1 << input));
                bitSize = randomChoice;
            }
            string binary = Convert.ToString(bitSize, 2);
            binary = binary.PadLeft(input, '0');
            return binary;
        }
    }
}

谢谢。

4

4 回答 4

2

你只能改变一件事,因为你的类只包含一个静态成员,为什么不把类设为静态。

于 2012-12-26T07:35:30.107 回答
2

看来您使用Random不正确。我建议从Jon Skeet 关于这个主题的文章开始。相关报价:

如果您启动一个具有相同初始状态(可以通过种子提供)的 Random 实例并对其进行相同的方法调用序列,您将获得相同的结果。

那么我们的示例代码出了什么问题呢?我们在循环的每次迭代中都使用了一个新的 Random 实例。Random 的无参数构造函数将当前日期和时间作为种子 - 在内部计时器计算出当前日期和时间已更改之前,您通常可以执行大量代码。因此,我们重复使用相同的种子 - 并重复获得相同的结果。

换句话说,由于Random每次调用都会创建一个新实例,因此返回值不会像您期望的那样“随机”的可能性会大大增加。

还值得一提的是,.Net BCL 中已经有可能更好的 PRNG 类。这是编写类似代码的另一种方式。

private static readonly RNGCryptoServiceProvider _crypto = new RNGCryptoServiceProvider();

public static long Generate(){
    // use whatever size you want here; bigger has a better chance of 
    // being unique in a given scope
    byte[] bytes = new byte[8];

    // puts random bytes into the array
    _crypto.GetBytes( bytes );

    // do something (your choice) with the value...
    return BitConverter.ToInt64( bytes, 0 );
}
于 2012-12-26T07:37:34.097 回答
1

如果我是项目团队负责人,我会要求您删除摘要/作者/版本评论。它们是多余的(源代码控制有该信息),需要一些时间来编写/修改并且模棱两可(在由 7 个作者修改的文件中?)。

这是关于这个主题的讨论,也许不是唯一的:https ://softwareengineering.stackexchange.com/q/48562/30927

于 2012-12-26T07:45:07.773 回答
0

将变量“Choice”移到其用法附近,即在 else 循环中。否则,即使未使用,您也会为随机对象分配不必要的内存。看这里

于 2012-12-26T08:46:02.060 回答