2012-03-08 6 views
5

कोई सोचता है कि गाइड में बाइट्स का वितरण यादृच्छिक था, या कम से कम बहुत सपाट था। क्या कारण है कि Guid.NewGuid हमेशा guids बनाता है जिसमें 4 होता है? जिसका स्ट्रिंग प्रतिनिधित्व 4 है?Guid.NewGuid कभी ग्रिड क्यों नहीं बनाता है जिसमें 4 नहीं होता है?

है

Guid.NewGuid()। ToString ("एन")। शामिल हैं ("4")

हमेशा सच है।

त्वरित परीक्षण इंगित करता है कि अधिकांश बाइट लगभग 85% गुड्स में होते हैं, लेकिन 4% 100 में होते हैं। शायद इससे कोई फर्क नहीं पड़ता, लेकिन मुझे यह जानना अच्छा लगेगा कि क्यों।

[संपादित करें]
मैं बहुत स्पष्ट नहीं था, इसलिए मेरे प्रश्न की स्पष्टता में सुधार करने के लिए संपादित किया गया।


इसे चलाएं। बिल्कुल गहरा नहीं, लेकिन मजेदार है।

using System; using System.Diagnostics;

namespace ConsoleApplication1 { class Program { static bool paused, exit;

static void Main(string[] args) 
    { 
     Console.WindowHeight = (int)(0.8*Console.LargestWindowHeight); 

     var reportInterval = TimeSpan.FromSeconds(0.15); 
     WriteLine(ConsoleColor.White, "X key to exit."); 

     Guid guid; 
     byte[] bytes; 
     long guidCount = 0; 
     var counts = new long[256]; 
     var watch = Stopwatch.StartNew(); 
     var cursorPos = new CursorLocation(); 

     while (!exit) 
     { 
      if (!paused) 
      { 
       guid = Guid.NewGuid(); 
       bytes = guid.ToByteArray(); 
       ++guidCount; 

       for (int i = 0; i < 16; i++) 
       { 
        var b = bytes[i]; 
        ++counts[b]; 
       } 

       if (watch.Elapsed > reportInterval) 
       { 
        cursorPos.MoveCursor(); 
        DumpFrequencies(counts, guidCount); 
        watch.Restart(); 
       } 
      } 

      if (Console.KeyAvailable) 
      { 
       ProcessKey(Console.ReadKey()); 
      } 
     } 
    } 


    static void ProcessKey(ConsoleKeyInfo keyInfo) 
    { 
     switch (keyInfo.Key) 
     { 
      case ConsoleKey.P: 
       paused = !paused; 
       break; 
      case ConsoleKey.X: 
       exit = true; 
       break; 
     } 
    } 


    static void DumpFrequencies(long[] byteCounts, long guidCount) 
    { 
     Write("\r\n{0} GUIDs generated. Frequencies:\r\n\r\n", guidCount); 

     const int itemWidth = 9; 
     int colCount = Console.WindowWidth/(itemWidth*2); 

     for (int i = 0; i < 256; i++) 
     { 
      var f = (double)byteCounts[i]/(16 * guidCount); 
      Write(RightAdjust(itemWidth, "{0:x}", i)); 
      Write(GetFrequencyColor(f), " {0:p}".PadRight(itemWidth), f); 
      if ((i + 1) % colCount == 0) Write("\r\n"); 
     } 
    } 


    static ConsoleColor GetFrequencyColor(double f) 
    { 
     if (f < 0.003) return ConsoleColor.DarkRed; 
     if (f < 0.004) return ConsoleColor.Green; 
     if (f < 0.005) return ConsoleColor.Yellow; 
     return ConsoleColor.White; 
    } 


    static string RightAdjust(int w, string s, params object[] args) 
    { 
     if (args.Length > 0) 
      s = string.Format(s, args); 
     return s.PadLeft(w); 
    } 

    #region From my library, so I need not include that here... 
    class CursorLocation 
    { 
     public int X, Y; 
     public CursorLocation() 
     { 
      X = Console.CursorLeft; 
      Y = Console.CursorTop; 
     } 

     public void MoveCursor() 
     { 
      Console.CursorLeft = X; 
      Console.CursorTop = Y; 
     } 
    } 


    static public void Write(string s, params object[] args) 
    { 
     if (args.Length > 0) s = string.Format(s, args); 
     Console.Write(s); 
    } 


    static public void Write(ConsoleColor c, string s, params object[] args) 
    { 
     var old = Console.ForegroundColor; 
     Console.ForegroundColor = c; 
     Write(s, args); 
     Console.ForegroundColor = old; 
    } 


    static public void WriteNewline(int count = 1) 
    { 
     while (count-- > 0) Console.WriteLine(); 
    } 


    static public void WriteLine(string s, params object[] args) 
    { 
     Write(s, args); 
     Console.Write(Environment.NewLine); 
    } 


    static public void WriteLine(ConsoleColor c, string s, params object[] args) 
    { 
     Write(c, s, args); 
     Console.Write(Environment.NewLine); 
    } 
    #endregion 
} 

}

मैं कैसे कुछ दिन सामान फ़ॉर्मेट करने के लिए ठीक से यहां सीखने की जरूरत है। Stackoverflow grrr-eat है।

+5

[GUIDs यादृच्छिक नहीं हैं] (http://en.wikipedia.org/wiki/GUID#Algorithm)। –

+0

@ कोनराड रुडॉल्फ यही कारण है कि मैं बाइट्स के _distribution_ के बारे में यादृच्छिक ** या ** कम से कम बहुत सपाट होने के बारे में इतना विशिष्ट था। मुझे पता था कि वे काफी यादृच्छिक नहीं थे, हालांकि क्यों नहीं। –

+2

हमारे गाइड को जलाना बंद करो! – U1199880

उत्तर

8

GUID पूरी तरह यादृच्छिक नहीं हैं, वह स्थान जहां 4 GUID उत्पन्न होने के "प्रकार" को इंगित करता है।

देखें http://en.wikipedia.org/wiki/Globally_unique_identifier

+1

ग्रेट। जब मैंने खोज-जैसा-आप-प्रकार के लिए समर्थन के साथ एक वृक्षदृश्य नियंत्रण किया तो मैंने बस इस पर ठोकर खाई। परीक्षण करने के लिए, मैंने उन ग्रंथों को प्राप्त करने के लिए ग्रिड पर ToString ("N") का उपयोग करके विशाल और अर्ध-यादृच्छिक पेड़ बनाए, जिन्हें मैं खोज सकता था। नियंत्रण दिखाता है कि कितने मैच हैं, मिलान नोड्स को हाइलाइट करते हैं, पहले मैच को स्क्रॉल करते हैं, और उपयोगकर्ता को अगले/पिछला मैच (w/wrap-around) नेविगेट करने देता है। यह अच्छी तरह से काम करता था, लेकिन जब मैंने "4" टाइप किया तो मैं अपने 100,000-नोड पेड़ में 100,000 मैचों को देखकर बहुत हैरान था। :) –

संबंधित मुद्दे