View difference between Paste ID: vmhGzKP7 and pr2RwcEN
SHOW: | | - or go back to the newest paste.
1
/*
2
   
3-
  /*
3+
4
     ======================================
5
6
  I have written a C# class, SoundRandom, which may be used to generate small quantities of random numbers. It is simple to use...
7
8-
  This class, SoundRandom, may be used as follows.
8+
9
  SoundRandom sr = new SoundRandom();
10
11
2) An unlimited sequence of random uints may then be collected by repeatedly
12
   getting the RandomUint property:
13
  sr.RandomUint
14
15
Such random uints, which are truly random, will be generated at the rate of about
16
one thousand per second. These values may then be used, for example, to create
17-
Such random uints will be generated at the rate of about one thousand per second.
17+
seeds for some deterministic random number generator.
18
19-
These values may then be used to create seeds for some deterministic random number generator.
19+
20
a microphone socket. No microphone needs to be plugged into the socket.
21
By default, the program sets the audio sample rate to 100,000 Hz, in stereo.
22-
a microphone socket. No microphone  needs to be plugged into the socket.
22+
23
The program uses a traditional Von Neumann randomness extractor on the
24-
The program then uses a traditional Von Neumann randomness extractor on that
24+
25
26
So, a simple demo program to create ten random uints and display them in
27
hexadecimal might be as follows:
28
29
  SoundRandom sr = new SoundRandom();
30
  for (int i = 0; i < 10; i++)
31
  {
32
    Tell(sr.RandomUint.ToString("x8"));
33
  }
34
35
Producing the following output, perhaps:
36
37
  5b6525e3
38
  083d5a7a
39
  dddf47f2
40
  0fee1071
41
  1d8b4e65
42
  83027594
43
  58f18820
44
  c0afaac9
45
  92e61b46
46
  0fb6b399
47
48
  */
49
50
  public class SoundRandom
51
  {
52
    private static readonly int           bitsPerUint = 32;
53
    private EventHandler<WaveInEventArgs> bufferHandler = null;
54
    private int                           channels = 0;
55
    private ManualResetEvent              bufferReady = new ManualResetEvent(false);
56
    private int                           nextI = 0;
57
    private int                           randomBufferSize = 0;
58
    private int                           randomCount = 0;
59
    private uint[]                        randoms = null;
60
    private uint                          randomUint = 0;
61
    private int                           randomUintBitCount = 0;
62
    private int                           sampleRate = 0;
63
    private WaveInEvent                   waveInStream = null;
64
65
    public SoundRandom(
66
      int randomBufferSize_param,
67
      int sampleRate_param,
68
      int channels_param
69
    )
70
    {
71
      randomBufferSize = randomBufferSize_param;
72
      sampleRate = sampleRate_param;
73
      channels = channels_param;
74
75
      nextI = randomBufferSize;
76
      randoms = new uint[randomBufferSize];
77
    } // ctor int int int
78
79
    public SoundRandom() : this(1000, 100000, 2)
80
    {
81
      //
82
    } // ctor
83
84
    public uint RandomUint
85
    {
86
      get
87
      {
88
        if (nextI >= randomBufferSize)
89
        {
90
          StartCapture();
91
          bufferReady.WaitOne();
92
          bufferReady.Reset();
93
        }
94
        return randoms[nextI++];
95
      } // get
96
97
    } // RandomUint
98
99
    private void HandleNextBuffer(object sender, WaveInEventArgs e)
100
    {
101
      byte[] buffer = e.Buffer;
102
      int    bytes = e.BytesRecorded;
103
      int    count = bytes/4;
104
105
      for (int i = 0; i < count; i++)
106
      {
107
        int j = i*4;
108
        uint b1 = (uint)(buffer[j] & 1);
109
        uint b2 = (uint)(buffer[j+2] & 1);
110
111
        if (b1 != b2)
112
        {
113
          randomUint = (randomUint << 1) | b2;
114
          ++randomUintBitCount;
115
          if (randomUintBitCount == bitsPerUint)
116
          {
117
            randomUintBitCount = 0;
118
            if (randomCount >= 0)
119
            {
120
              randoms[randomCount] = randomUint;
121
            }
122
            randomUint = 0;
123
            ++randomCount;
124
            if (randomCount == randomBufferSize)
125
            {
126
              waveInStream.DataAvailable -= bufferHandler;
127
              waveInStream.StopRecording();
128
              waveInStream.Dispose();
129
              waveInStream = null;
130
              bufferReady.Set();
131
              return;
132
            }
133
          }
134
        }
135
      } // for i
136
    } // HandleNextBuffer
137
138
    public void StartCapture()
139
    {
140
      bufferHandler = new EventHandler<WaveInEventArgs>(HandleNextBuffer);
141-
      bufferHandler = new EventHandler<WaveInEventArgs>(HandleNextBuffer) ;
141+
142
      randomCount = -1;
143
      randomUint = 0;
144
      randomUintBitCount = 0;
145
146
      waveInStream = new WaveInEvent();
147
      waveInStream.WaveFormat = new WaveFormat(sampleRate, channels);
148
      waveInStream.DataAvailable += bufferHandler;
149
      waveInStream.StartRecording();
150
    } // StartCapture
151
152
  } // SoundRandom