can anybody convert this java into Blitz3D
Blitz3D Forums/Blitz3D Programming/can anybody convert this java into Blitz3D| 
 | ||
| 
import java.util.Date;
public class BD4Rand {
	private long seed;
	private long mult;
	public int add = 0x0000b;
	public BD4Rand(long s) {
		srand48(s);
	}
	public void srand48() {
		Date d = new Date();
		srand48(d.getTime());
	}
	public void srand48(long set_seed) {
		long tmp		= 0x0005de;
		this.mult	= (tmp<<24)+0xece66d;
		this.seed	= (set_seed<<16)+0x330e;
	}
	public double nextDouble() {
		long accu,t1,t0;
		accu = (this.mult&0xFFFF) * (this.seed&0xFFFF) + add;
		t0 = (accu&0xFFFF);
		accu >>= 16;
		accu += (this.mult&0xFFFF) * ((this.seed>>16)&0xFFFF) +
					((this.mult>>16)&0xFFFF)*(this.seed&0xFFFF);
		t1 = (accu&0xFFFF);
		accu >>= 16;
		accu += (this.mult&0xFFFF) * ((this.seed>>32)&0xFFFF) +
					((this.mult>>16)&0xFFFF)*((this.seed>>16)&0xFFFF) +
					((this.mult>>32)&0xFFFF)*(this.seed&0xFFFF);
		this.seed = ((accu&0xFFFF)<<32) + (t1<<16) + t0;
		return this.seed*java.lang.Math.pow(2,-48);
	}
}
i just can't get my head into this java any help would be much appreciated, its supposed to be a random number generator, yeah i know blitz has one but this has to match this code so games in both languages are compatible.... Ian | 
| 
 | ||
| Well .. I did my best. Not sure if it works though, because I don't know how it should work, but maybe you can finetune it: | 
| 
 | ||
| Taking a quick look, I don't think it can be done. For a start, it's using long ints (64bit) which blitz doesn't support. | 
| 
 | ||
| thanks for that b32, i'll check out your gamebuilder too.... this is a C version if it helps too make things clearer, just messes with my head... 
#include <math.h>
#include <stdlib.h>
unsigned short bd4Rand48_seed[3] = { 0x330e, 0xabcd, 0x1234 };
unsigned short bd4Rand48_mult[3] = { 0xe66d, 0xdeec, 0x0005 };
unsigned short bd4Rand48_add = 0x000b;
void bd4srand(long seed)
{
	bd4Rand48_seed[0] = 0x330e;
	bd4Rand48_seed[1] = (unsigned short) seed;
	bd4Rand48_seed[2] = (unsigned short) (seed >> 16);
	bd4Rand48_mult[0] = 0xe66d;
	bd4Rand48_mult[1] = 0xdeec;
	bd4Rand48_mult[2] = 5;
	bd4Rand48_add = 0x000b;
}                                       
double bd4rand(void)
{ 
	unsigned long accu;
	unsigned short temp[2];
	accu = (unsigned long) bd4Rand48_mult[0] * (unsigned long) bd4Rand48_seed[0] +
	 (unsigned long) bd4Rand48_add;
	temp[0] = (unsigned short) accu;	/* lower 16 bits */
	accu >>= sizeof(unsigned short) * 8;
	accu += (unsigned long) bd4Rand48_mult[0] * (unsigned long) bd4Rand48_seed[1] +
	 (unsigned long) bd4Rand48_mult[1] * (unsigned long) bd4Rand48_seed[0];
	temp[1] = (unsigned short) accu;	/* middle 16 bits */
	accu >>= sizeof(unsigned short) * 8;
	accu += bd4Rand48_mult[0] * bd4Rand48_seed[2] + bd4Rand48_mult[1] * bd4Rand48_seed[1] + bd4Rand48_mult[2] * bd4Rand48_seed[0];
	bd4Rand48_seed[0] = temp[0];
	bd4Rand48_seed[1] = temp[1];
	bd4Rand48_seed[2] = (unsigned short) accu;
	return ldexp((double) bd4Rand48_seed[0], -48) +
	       ldexp((double) bd4Rand48_seed[1], -32) +
	       ldexp((double) bd4Rand48_seed[2], -16);
}
/**
 *		Basically copies a number of calls to a seeds drand48 with the "_add"
 *		variable changed from 0x0b==11 to 0x3d==61
 */
int bd4l(long key) {
	unsigned short bd4l_seed[3] = { 0x330e, 0xabcd, 0x1234 };
	unsigned short bd4l_mult[3] = { 0xe66d, 0xdeec, 0x0005 };
	unsigned short bd4l_add = 61; /* 0x000b;*/
	unsigned long accu;
	unsigned short temp[2];
	double tmp;
	int i;
	bd4l_seed[1] = (unsigned short) key;
	bd4l_seed[2] = (unsigned short) (key >> 16);
	/**
	 *		Repreat random "drand48-similar" loop 5-15 times.
	 *	
	 */
	for(i=-5;i<(key%10);i++) {
		accu = (unsigned long) bd4l_mult[0] * (unsigned long) bd4l_seed[0] +
	 	(unsigned long) bd4l_add;
		temp[0] = (unsigned short) accu;	/* lower 16 bits */
		accu >>= sizeof(unsigned short) * 8;
		accu += (unsigned long) bd4l_mult[0] * (unsigned long) bd4l_seed[1] +
	 	(unsigned long) bd4l_mult[1] * (unsigned long) bd4l_seed[0];
		temp[1] = (unsigned short) accu;	/* middle 16 bits */
		accu >>= sizeof(unsigned short) * 8;
		accu += bd4l_mult[0] * bd4l_seed[2] + bd4l_mult[1] * bd4l_seed[1] + bd4l_mult[2] * bd4l_seed[0];
		bd4l_seed[0] = temp[0];
		bd4l_seed[1] = temp[1];
		bd4l_seed[2] = (unsigned short) accu;
	}
	tmp = ldexp((double) bd4l_seed[0], -48) +
	       ldexp((double) bd4l_seed[1], -32) +
	       ldexp((double) bd4l_seed[2], -16);
	return 9787*tmp;
}
 | 
| 
 | ||
| Are you sure that C conversion is accurate? Like Big10P I understood that longs in java are 64bit, whereas ( and I know my C is very rusty ) I thought C longs were 32 bit. | 
| 
 | ||
| well that is from the same guy and it does the same job(i am told), i have no idea to tell the truth having no experience in either of the languages. | 
| 
 | ||
| at a guess from what i have managaed to comprehend of the two he is only using the lower (16 bits) and middle (16 bits) total of 32bits anyway, no idea if this is correct as i said i dont get it.... | 
| 
 | ||
| Here, I forgot to include 'return b' in the create function. And I made a test at the start of the program: | 
| 
 | ||
| That float look way too long for B3D to handle. | 
| 
 | ||
| The fact that nextDouble() is returning a single precision value in Blitz should tell you this is not going to work. | 
| 
 | ||
|  Are you sure that C conversion is accurate? Like Big10P I understood that longs in java are 64bit, whereas ( and I know my C is very rusty ) I thought C longs were 32 bit. Yeah, I don't actually know java but assumed long ints must be 64bit since the code is performing a 32bit shift on the value, at one point. Doing so would make no sense if the value itself was only 32bit. | 
| 
 | ||
| Hmm, that sounds logical .. I just converted the code, but I didn't try to understand what it does other than that it should generate random numbers somehow. When trying it, it returned *something*, so I thought that it would be allright. (Although I did notice that the generated numbers seem quite small for random values) So erm .. nevermind than. | 
| 
 | ||
|  Although I did notice that the generated numbers seem quite small for random values In many languages, random numbers are between 0 and 1, if you want a random number between 147 and 501, you multiply the random number by 354 and add 147. |