105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2010 Google Inc. 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 1105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#ifndef GrRandom_DEFINED 1205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#define GrRandom_DEFINED 1305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 1405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerclass GrRandom { 1505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerpublic: 1605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger GrRandom() : fSeed(0) {} 1705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger GrRandom(uint32_t seed) : fSeed(seed) {} 1805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 1905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger uint32_t seed() const { return fSeed; } 2005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 2105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger uint32_t nextU() { 2205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger fSeed = fSeed * kMUL + kADD; 2305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger return fSeed; 2405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger } 2505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 2605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger int32_t nextS() { return (int32_t)this->nextU(); } 2705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 2805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 2905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Returns value [0...1) as a float 3005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 3105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger float nextF() { 3205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger // const is 1 / (2^32 - 1) 3305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger return (float)(this->nextU() * 2.32830644e-10); 3405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger } 3505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 3605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /** 3705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * Returns value [min...max) as a float 3805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 3905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger float nextF(float min, float max) { 4005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger return min + this->nextF() * (max - min); 4105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger } 4205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 4305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenbergerprivate: 4405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger /* 4505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger * These constants taken from "Numerical Recipes in C", reprinted 1999 4605b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger */ 4705b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger enum { 4805b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger kMUL = 1664525, 4905b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger kADD = 1013904223 5005b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger }; 5105b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger uint32_t fSeed; 5205b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger}; 5305b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 5405b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger#endif 5505b6b4d746867a9fb02e14edfe1bf3685abeb813Derek Sollenberger 56