2012-12-26 97 views
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; 
     } 
    } 
} 

謝謝。

回答

2

看起來您錯誤地使用了Random。我建議從Jon Skeet's article on the subject開始。相關報價:

如果用相同的初始狀態 (可通過種子來提供)開始隨機的一個實例,使 方法相同的序列調用它,你會得到同樣的結果。

那麼在我們的示例代碼中出了什麼問題?我們在循環的每次迭代中都使用了一個新的實例 Random。 Random的無參數構造函數 將當前日期和時間作爲種子 - 在內部計時器 計算出當前日期和時間已更改之前,您通常可以執行相當數量的代碼。因此,我們是 重複使用相同的種子 - 並重復獲得相同的結果 。

換句話說,因爲你正在創建的Random一個新實例每次調用,你是大大增加了機會,返回值將不會像「隨機」如你所願。

另外值得一提的是,在.Net BCL中已經有potentially better 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); 
} 
+0

感謝您的意見。我如何解決這個問題? –

+1

最重要的一點是保留一個RNG實例,而不是重複創建新的實例。我添加了一個示例,顯示了這樣做的一種方式,並且還使用了更強大的RNG。我鏈接的文章顯示了使用「隨機」和「RNGCryptoServiceProvider」的各種方法。 –

2

你可能只能改變一件事,因爲你的類只包含一個靜態成員,爲什麼不把該類設爲靜態。

1

如果我是項目組組長,我會要求您刪除摘要/作者/版本註釋。它們是多餘的(源代碼管理有這樣的信息),需要一些時間來編寫/修改,並且是不明確的(在7位作者的修改文件中)。

這裏有一個關於這個話題的討論,也許不是唯一的一個:https://softwareengineering.stackexchange.com/q/48562/30927

+0

確實不錯! –

0

移動變量「選擇」接近其他環路內的使用即。 否則,即使未使用,您也會爲隨機對象分配不必要的內存。 請參閱here