Ok, I get it. Ted's suggestion is probably something to follow --
instead of seeding congruential random with a checksum of your vector
(which I assume you did and caused values < 0.2) you can calculate a
better checksum (and convert it to a double from bits directly?).
MurmurHash is a good option, Andrzej Bialecki had an implementation
for streaming checksums, HPPC has one for permuting primitive types:

http://labs.carrotsearch.com/download/hppc/0.3.3/api/com/carrotsearch/hppc/hash/package-summary.html

Dawid

On Mon, Feb 21, 2011 at 4:08 AM, Ted Dunning <[email protected]> wrote:
> This is why we normally use prng's based on murmur hash for building
> deterministic random vectors. Smutty and Jake can probably get you a
> specific pointer before I get back to a real computer. Alternately
> search for references to MurmurHash.
>
> On Sunday, February 20, 2011, Lance Norskog <[email protected]> wrote:
>> I discovered this when I wanted to make deterministic random vectors
>> and matrices. To get the same result from each entry on every access,
>> I can either cache the values or use an algorithm to recreate unique
>> seed for that entry. I naively just added the coordinate to the base
>> seed, and created very not-random vectors and matrices. Yes, the JDK
>> Random is intended to be lame but fast., but this was just too far
>> over the line.
>>
>> Lance
>>
>> On Sun, Feb 20, 2011 at 2:31 AM, Dawid Weiss
>> <[email protected]> wrote:
>>> A perhaps better question is what are you trying to prove or what was
>>> your original intention? :) This is a very strange program indeed --
>>> what it does is basically check what the next double value from a
>>> fixed initial seed is... since random uses a relatively simple
>>> congruential algorithm, the result isn't really that surprising (to
>>> me?).
>>>
>>> Dawid
>>>
>>> On Sun, Feb 20, 2011 at 2:51 AM, Lance Norskog <[email protected]> wrote:
>>>> What does this program print?
>>>>
>>>>
>>>> package hack;
>>>>
>>>> import java.util.Random;
>>>>
>>>> public class JDKRandomThreatOrMenace {
>>>>
>>>>        public static void main(String[] args) {
>>>>                Random rnd = new Random(0);
>>>>
>>>>                double last = rnd.nextDouble();
>>>>                long i = 1;
>>>>                for(; i < Long.MAX_VALUE; i++) {
>>>>                        rnd.setSeed(i);
>>>>                        double next = rnd.nextDouble();
>>>>                        if (Math.abs(next - last) > 0.2)
>>>>                                break;
>>>>                }
>>>>                System.out.println(i);
>>>>        }
>>>>
>>>> }
>>>>
>>>> Your prize if you get it right? A patch would be welcome...
>>>>
>>>>
>>>
>>
>>
>>
>> --
>> Lance Norskog
>> [email protected]
>>
>
>

Reply via email to