An interview question: About Probability

前端 未结 10 1606
清酒与你
清酒与你 2021-01-29 21:14

An interview question:

Given a function f(x) that 1/4 times returns 0, 3/4 times returns 1. Write a function g(x) using f(x) that 1/2 times returns 0, 1/2 times returns

10条回答
  •  渐次进展
    2021-01-29 21:52

    This is much like the Monty Hall paradox.

    In general.

    Public Class Form1
    
        'the general case
        '
        'twiceThis = 2 is 1 in four chance of 0
        'twiceThis = 3 is 1 in six chance of 0
        '
        'twiceThis = x is 1 in 2x chance of 0
    
        Const twiceThis As Integer = 7
        Const numOf As Integer = twiceThis * 2
    
        Private Sub Button1_Click(ByVal sender As System.Object, _
                                  ByVal e As System.EventArgs) Handles Button1.Click
    
            Const tries As Integer = 1000
            y = New List(Of Integer)
    
            Dim ct0 As Integer = 0
            Dim ct1 As Integer = 0
            Debug.WriteLine("")
            ''show all possible values of fx
            'For x As Integer = 1 To numOf
            '    Debug.WriteLine(fx)
            'Next
    
            'test that gx returns 50% 0's and 50% 1's
            Dim stpw As New Stopwatch
            stpw.Start()
            For x As Integer = 1 To tries
                Dim g_x As Integer = gx()
                'Debug.WriteLine(g_x.ToString) 'used to verify that gx returns 0 or 1 randomly
                If g_x = 0 Then ct0 += 1 Else ct1 += 1
            Next
            stpw.Stop()
            'the results
            Debug.WriteLine((ct0 / tries).ToString("p1"))
            Debug.WriteLine((ct1 / tries).ToString("p1"))
            Debug.WriteLine((stpw.ElapsedTicks / tries).ToString("n0"))
    
        End Sub
    
        Dim prng As New Random
        Dim y As New List(Of Integer)
    
        Private Function fx() As Integer
    
            '1 in numOf chance of zero being returned
            If y.Count = 0 Then
                'reload y
                y.Add(0) 'fx has only one zero value
                Do
                    y.Add(1) 'the rest are ones
                Loop While y.Count < numOf
            End If
            'return a random value 
            Dim idx As Integer = prng.Next(y.Count)
            Dim rv As Integer = y(idx)
            y.RemoveAt(idx) 'remove the value selected
            Return rv
    
        End Function
    
        Private Function gx() As Integer
    
            'a function g(x) using f(x) that 50% of the time returns 0
            '                           that 50% of the time returns 1
            Dim rv As Integer = 0
            For x As Integer = 1 To twiceThis
                fx()
            Next
            For x As Integer = 1 To twiceThis
                rv += fx()
            Next
            If rv = twiceThis Then Return 1 Else Return 0
    
        End Function
    End Class
    

提交回复
热议问题