• That is an interesting puzzle. Here is another solution using a CTE instead of a loop.

    -- Setup

    set nocount on

    -- Create a table to store the results.

    create table Doors

    (ID int

    ,ChosenDoor int

    ,WinningDoor int

    ,WinLose as case when ChosenDoor = WinningDoor then 0 else 1 end -- Win = 1, Lose = 0

    );

    -- Use a CTE to generate 10,000 "contestants" and their chosen/winning doors.

    -- If the chosen door equals the winning door the contestant will switch when given the

    -- option and lose. Otherwise they will switch to the winning door and win.

    with Digits(i)

    as (select i

    from (select 1 union select 2 union select 3 union select 4 union select 5 union

    select 6 union select 7 union select 8 union select 9 union select 0) AS X(i))

    insert into Doors(ID, ChosenDoor, WinningDoor)

    select (D3.i * 1000 + D2.i * 100 + D1.i * 10 + D0.i) AS seq

    ,abs(cast(cast(newid() as varbinary) as int)) % 3 + 1 ChosenDoor

    ,abs(cast(cast(newid() as varbinary) as int)) % 3 + 1 WinningDoor

    from Digits as D0, Digits as D1, Digits as D2, Digits as D3

    -- Select the total number of winners (1) and losers (0).

    selectWinLose

    ,count(*) Total

    from Doors

    group by WinLose

    -- Clean-up

    drop table Doors

    set nocount off