Erand48 (X) doesn't work in C ++, Visual Studio 12

I have C ++ code that has line c erand48(X)

on multiple lines and Visual Studio is giving an error Unable to identify

. I searched the web and found out that erand48()

doesn't exist in Visual Studio (or Windows). The suggestions were to write the implementation by yourself. Can anyone provide me with an implementation for this as I am new to this and have little time to give too much time for this.

There are also multiple lines starting with uniform

like uniform sampler2D Texture

and this gives an error like the value or constructor 'uniform' not defined

. Why is it showing this error and how to remove it?

+3


source to share


2 answers


Use uniform_real_distribution

Class instead.

#include <random>
#include <iostream>
std:: default_random_engine generator;
std::uniform_real_distribution<double> distr(0.0,1.0);
double erand48(int X){
    return distr(generator);
}

int main(){
    std::cout << erand48(1) << std::endl;
    return 0;
}

      



or just use LibGW32C for windows

+7


source


I was looking for this method erand48

(also with Visual Studio 2015) because

  • this is a safe stream,
  • the caller must save and pass state,
  • it's pure C (don't ask me which version, it's old enough for me).


So instead of providing an alternative (C ++), I'll answer the question by providing a possible implementation.

#pragma once

#include <stdlib.h>
#include <math.h>

#define RAND48_SEED_0   (0x330e)
#define RAND48_SEED_1   (0xabcd)
#define RAND48_SEED_2   (0x1234)
#define RAND48_MULT_0   (0xe66d)
#define RAND48_MULT_1   (0xdeec)
#define RAND48_MULT_2   (0x0005)
#define RAND48_ADD      (0x000b)

unsigned short _rand48_seed[3] = {
    RAND48_SEED_0,
    RAND48_SEED_1,
    RAND48_SEED_2
};
unsigned short _rand48_mult[3] = {
    RAND48_MULT_0,
    RAND48_MULT_1,
    RAND48_MULT_2
};
unsigned short _rand48_add = RAND48_ADD;

void _dorand48(unsigned short xseed[3]) 
{
    unsigned long accu;
    unsigned short temp[2];

    accu = (unsigned long)_rand48_mult[0] * (unsigned long)xseed[0] +
        (unsigned long)_rand48_add;
    temp[0] = (unsigned short)accu;        /* lower 16 bits */
    accu >>= sizeof(unsigned short) * 8;
    accu += (unsigned long)_rand48_mult[0] * (unsigned long)xseed[1] +
        (unsigned long)_rand48_mult[1] * (unsigned long)xseed[0];
    temp[1] = (unsigned short)accu;        /* middle 16 bits */
    accu >>= sizeof(unsigned short) * 8;
    accu += _rand48_mult[0] * xseed[2] + _rand48_mult[1] * xseed[1] + _rand48_mult[2] * xseed[0];
    xseed[0] = temp[0];
    xseed[1] = temp[1];
    xseed[2] = (unsigned short)accu;
}

double erand48(unsigned short xseed[3])
{
    _dorand48(xseed);
    return ldexp((double)xseed[0], -48) +
        ldexp((double)xseed[1], -32) +
        ldexp((double)xseed[2], -16);
}

double drand48(void)
{
    return erand48(_rand48_seed);
}

long lrand48(void) 
{
    _dorand48(_rand48_seed);
    return ((long)_rand48_seed[2] << 15) + ((long)_rand48_seed[1] >> 1);
}

long nrand48(unsigned short xseed[3]) 
{
    _dorand48(xseed);
    return ((long)xseed[2] << 15) + ((long)xseed[1] >> 1);
}

long mrand48(void) 
{
    _dorand48(_rand48_seed);
    return ((long)_rand48_seed[2] << 16) + (long)_rand48_seed[1];
}

long jrand48(unsigned short xseed[3]) 
{
    _dorand48(xseed);
    return ((long)xseed[2] << 16) + (long)xseed[1];
}

void srand48(long seed) 
{
    _rand48_seed[0] = RAND48_SEED_0;
    _rand48_seed[1] = (unsigned short)seed;
    _rand48_seed[2] = (unsigned short)(seed >> 16);
    _rand48_mult[0] = RAND48_MULT_0;
    _rand48_mult[1] = RAND48_MULT_1;
    _rand48_mult[2] = RAND48_MULT_2;
    _rand48_add = RAND48_ADD;
}

unsigned short *seed48(unsigned short xseed[3]) 
{
    static unsigned short sseed[3];

    sseed[0] = _rand48_seed[0];
    sseed[1] = _rand48_seed[1];
    sseed[2] = _rand48_seed[2];
    _rand48_seed[0] = xseed[0];
    _rand48_seed[1] = xseed[1];
    _rand48_seed[2] = xseed[2];
    _rand48_mult[0] = RAND48_MULT_0;
    _rand48_mult[1] = RAND48_MULT_1;
    _rand48_mult[2] = RAND48_MULT_2;
    _rand48_add = RAND48_ADD;
    return sseed;
}

void lcong48(unsigned short p[7]) 
{
    _rand48_seed[0] = p[0];
    _rand48_seed[1] = p[1];
    _rand48_seed[2] = p[2];
    _rand48_mult[0] = p[3];
    _rand48_mult[1] = p[4];
    _rand48_mult[2] = p[5];
    _rand48_add = p[6];
}

      

+1


source







All Articles