view TaskManager/kernel/ppe/Random.cc @ 370:4435c9990988

change TaskManger & memory/* & Random
author aaa
date Wed, 29 Jul 2009 15:09:36 +0900
parents 2b114977852d
children
line wrap: on
line source

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include "Random.h"
#define HAS_SRANDOMDEV 1

/**
 * /dev/urandom, random から取得した値を seed として使う
 */
Random::Random(void)
{
    reset();
}

/**
 * 引数で seed を指定する
 */
Random::Random(unsigned int seed)
{
    srandom(seed);
}

void
Random::reset(void)
{
#if HAS_SRANDOMDEV    
    FILE *fp;
    unsigned int seed;
    struct timeval tv;

    fp = fopen("/dev/urandom", "r");
    if (!fp) fp = fopen("/dev/random", "r");

    if (fp) {
	int res = fread(&seed, sizeof(unsigned int), 1, fp);
	if (res != sizeof(unsigned int)) {
	    fclose(fp);
	    fp = NULL;
	}
    }

    if (!fp) {
	gettimeofday(&tv, NULL);
	seed = (tv.tv_sec ^ tv.tv_usec);
    } else {
	fclose(fp);
    }

    srandom(seed);
#else
    srandomdev();
#endif
}

/*!
  1 から 2^(32-1) のランダムな数値を返す。
 */

int
Random::getData(void)
{
    return random();
}