[Screwed up setting the followup, sorry. Really setting followups to

alt.comp.lang.learn.c-c++ this time.]

On Sat, 09 Oct 2004 06:50:20 GMT, Faheem Mitha <fa****@email.unc.edu> wrote:

Hi,

I'm not sure what would be more appropriate, so I'm ccing it to both

alt.comp.lang.learn.c-c++ and comp.lang.python, with followup to

alt.comp.lang.learn.c-c++.

While working with a random number generator in the context of a mixed

Python/C++ programming problem. I encountered a vexing type

conversion problem.

[snip]

Thanks to Alwyn and Terry Reedy for explaining things to me. I think

I understand the main points. Harbison and Steele's "C A Reference

Manual" (I have the 4th Edn) had a clear explanation of how C

implements unsigned and signed ints, including two's complement and

all that.

It looks like using a random number generator which uses unsigned ints

as its seeds with Python is probably close to impossible then. Can

anyone suggest a good C/C++ random number implementation which can be

used easily with Python in this fashion? I want something that is

full-featured, ie. has reasonable support for different random number

distributions. Also, something that was already packaged in a

reasonable fashion as part of a shared library would be nice. I

suppose something whose seeds are stored as ints or longs would work

Ok.

I was trying to use r-mathlib

(

http://packages.debian.org/unstable/math/r-mathlib), the Debian

package corresponding to the standalone C Mathlib (math/stat library)

from R (

www.r-project.org). Unfortunately the random number

implementation uses unsigned ints, hence all the kerfuffle. I'm

including the source code at the end of this message, for the record.

I did have one followup question. If Python implements its integers as

signed C ints then surely 2^31 - 1 should be an integer rather than a

long? But I get

In [9]: 2**31 - 1

Out[9]: 2147483647L

In [10]: type(2**31 - 1)

Out[10]: <type 'long'>

Thanks for the help.

Faheem.

************************************************** *********************

src/nmath/standalone/sunif.c

************************************************** *********************

/*

* Mathlib : A C Library of Special Functions

* Copyright (C) 2000, 2003 The R Development Core Team

*

* This program is free software; you can redistribute it and/or modify

* it under the terms of the GNU General Public License as published by

* the Free Software Foundation; either version 2 of the License, or

* (at your option) any later version.

*

* This program is distributed in the hope that it will be useful,

* but WITHOUT ANY WARRANTY; without even the implied warranty of

* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

* GNU General Public License for more details.

*

* You should have received a copy of the GNU General Public License

* along with this program; if not, write to the Free Software

* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

*

*/

/* A version of Marsaglia-MultiCarry */

static unsigned int I1=1234, I2=5678;

void set_seed(unsigned int i1, unsigned int i2)

{

I1 = i1; I2 = i2;

}

void get_seed(unsigned int *i1, unsigned int *i2)

{

*i1 = I1; *i2 = I2;

}

double unif_rand(void)

{

I1= 36969*(I1 & 0177777) + (I1>>16);

I2= 18000*(I2 & 0177777) + (I2>>16);

return ((I1 << 16)^(I2 & 0177777)) * 2.328306437080797e-10; /* in [0,1) */

}