Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Module Module1
- Const K As Integer = 50
- Private Count As Integer
- Function RandK() As Integer
- Static r As New Random
- Count += 1
- Return r.Next(1, K + 1)
- End Function
- Private Function Rand2K1() As Integer
- Return RandK() * 2 - If(RandK() > K / 2, 1, 0)
- End Function
- Function Rand2Klist() As IEnumerable(Of Integer)
- Count = 0
- Dim lst = Enumerable.Range(1, 2 * K).ToList
- Dim result As New List(Of Integer)
- Dim j = Rand2K1() - 1
- For i = 0 To 2 * K - 1
- Debug.Assert(lst.Count = (2 * K - i))
- Debug.Assert(result.Count = i)
- Dim l = (j + RandK() + RandK() - 1) Mod (2 * K - i)
- result.Add(lst(l))
- lst.RemoveAt(l)
- j += RandK()
- Next
- Debug.Assert(lst.Count = 0)
- Return result
- End Function
- Private sum(0 To 2 * K - 1), pos(0 To 2 * K - 1) As Integer
- Sub CheckAndStats(ByVal lst As IEnumerable(Of Integer))
- Dim chkLst = lst.ToArray
- Array.Sort(chkLst)
- Debug.Assert(chkLst.Length = 2 * K)
- Debug.Assert(chkLst(0) = 1)
- Debug.Assert(chkLst(2 * K - 1) = 2 * K)
- chkLst = lst.ToArray
- For i = 0 To 2 * K - 1
- pos(chkLst(i) - 1) += i
- sum(i) += chkLst(i)
- Next
- End Sub
- Sub PrintStats()
- Console.WriteLine(" {0,4} {1,7} {2,7}", "no.", "Pos", "Avg")
- For i = 0 To 2 * K - 1
- Console.WriteLine(" {0,4} {1,7:f3} {2,7:f3}", i + 1, pos(i) / M - K, sum(i) / M - K)
- Next
- End Sub
- Const M As Integer = 10000
- Sub Main()
- Dim someLists(0 To M) As IEnumerable(Of Integer)
- For i = 0 To M
- someLists(i) = Rand2Klist.ToList
- Debug.Assert(Count = 6 * K + 2)
- Next
- For Each l In someLists
- CheckAndStats(l)
- Next
- PrintStats()
- If Debugger.IsAttached Then _
- Console.ReadLine()
- End Sub
- End Module
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement