GIL .. BIOSCI/Bionet News .. Biosequences .. Software .. FTP

# Statistics puzzle i05244c

Bradley K. Sherman bks at alfa.berkeley.edu
Thu Jun 16 00:02:08 EST 1994

```In article <2tfv1n\$t8d at cville-srv.wam.umd.edu> bcohen at wam.umd.edu (Brad Cohen) writes:
>
>Martin Gardner says that new mathematical puzzles are very
>difficult to devise.  What do you think of this one?

Not a lot, what's the bid?  The syntax leaves a lot to be
desired.  Here's a simulator for the problem that indicates
that the probability is about .48.  Note that I have included
the original problem wording in the main() routine.

--bks

/* -----------------------8< cut here for pesky.c >8------------*/
/*
*	pesky.c
*
*	to compile:
*		cc -o pesky pesky.c
*	to run:
*		pesky
*	Author:
*		Bradley K. Sherman (bks at s27w007.pswfs.gov)
*		Dendrome project, Institute of Forest Genetics
*		P.O. Box 245, Berkeley, CA, 94701
*	Date:
*		15 June 94
*
*/
#include <stdio.h>

#define WEST  0
#define NORTH 1
#define EAST  2
#define SOUTH 3

#define ACE_D 14
#define ACE_H 27

int Deal[52] = {
1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13,
14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52
};

main()
{
long int count = 0;
long int west_has_ace = 0;

srandom(getpid());

while( 1 ) {
shuffle();

/*
* A slightly less-than-honest bridge player (south)
* caught a glimpse of a card dealt to her opponent
* on the left (west) - it was a red ace (she could
* not tell which suit).
*/
if ( ! dealt(WEST, ACE_D)  &&  ! dealt(WEST, ACE_H) )
continue; /* No red ace for WEST */

/*
* This opponent -- west -- opens the game by playing
* the ace of diamonds.
*/
if ( ! dealt(WEST, ACE_D ) )
continue; /* No ace diamonds for WEST */
/*
* South sees that neither she nor the revealed cards
* of north have the ace of hearts, which must be in
* either east's hand or west's hand.
*/
if ( dealt( SOUTH, ACE_H )  ||  dealt( NORTH, ACE_H ) )
continue; /* S or N have the heart ace */

/*
* What is the probability now that west has the
* ace of hearts?
*/
++count; /* Start */
if ( dealt( WEST, ACE_H ) )
++west_has_ace;
if ( count % 100 == 0 ) {
printf( "has heart ace/deals = %d/%d = %g\n",
west_has_ace, count,
(double)west_has_ace/(double)count);
}
}
}

/* return 1 if player has card, 0 otherwise */
dealt( player, card )
{
int i, low, high;

switch(player){
case WEST  : low = 0;  high = 12; break;
case NORTH : low = 13; high = 25; break;
case EAST  : low = 26; high = 38; break;
case SOUTH : low = 39; high = 51; break;
}

for ( i = low; i <= high; i++ )
if ( Deal[i] == card )
return 1;
return 0;
}

/*
* Adapted from Knuth Vol 2. Algorithm P, p 139, 2nd ed.
*/
shuffle()
{
int j, k, tmp;
for ( j = 52; j > 0; j-- ) {
k = random() % j ; /* 0 <= k < 52 */
tmp = Deal[k]; /* swap */
Deal[k] = Deal[j - 1];
Deal[j - 1] = tmp;
}
}
/* -----------------------8< cut here for pesky.c >8------------*/

```