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. |