laziness, impatience, and hubris PerlMonks

### Re^4: How do I make a random shuffle deterministic?

by LanX (Bishop)
 on Dec 05, 2012 at 17:37 UTC ( #1007343=note: print w/replies, xml ) Need Help??

I just realized you had the same idea. But

1. The sum of two strings can be identical, try "rolf" and "rofl" and "flor"

2. for ( < @array > ) is dangerous nonsense, always do for (  @array  ) without glob

3. if you wanna play save, try a system cmd to get a mac adress.

4. You could determine a unique seed at installation time and store it in a module MyProject::Seed you use later. Like this you have full control (just edit the module) and you only need to fiddle once with the OS for a unique key.

5. you could even request a unique key over web at installation time.

Cheers Rolf

Replies are listed 'Best First'.
Re^5: How do I make a random shuffle deterministic?
by Anonymous Monk on Dec 05, 2012 at 17:46 UTC

Thanks for the tips. It is acceptable if some hosts have the same seed. Still, lessening those occurrences is a good thing. How about this:

```sub seed {
my \$string = shift;
my \$seed;

my @ascii = map ord, split //, \$string;
my \$product = pop @ascii;
for ( @ascii ) { \$seed += \$_ };

\$seed = \$seed * \$product;

srand \$seed;
}
"rolfi" and "flori"?

just a guess: try multiplying each ord with a different prime (by position) and do a module biggest prime <256 before adding.

UPDATE: the automatic seeding is quite efficient, so why don't you determine a unique seed at installation time from a random number.

Cheers Rolf

Re^5: How do I make a random shuffle deterministic?
by Anonymous Monk on Dec 06, 2012 at 15:07 UTC

New try after some research.

```use Sys::Hostname;
use Digest::MD5 qw( md5 );

sub seed {
my \$string = shift;
my \$seed = 0;

my \$digest = md5( \$string );

for ( split //, \$digest ) {
\$seed = ( \$seed * 256 + ord ) % 1e12;
}

srand \$seed;
}

# main matter
my \$hostname = hostname;
seed ( \$hostname );
Looks fine for me!

The modules are core and your producing a maximal seed.

Still think it's exaggerated for your problem...

... but it's a good generic solution for similar tasks! =)

My only concern is readability, better use something like ord \$char with an explicit loop var my \$char

Anyway you are still operating on the assumption that hostnames are always different, since I don't know your project this might be ok or not.

Generating a random seed at installation time would prevent this "problem".

Cheers Rolf

Create A New User
Node Status?
node history
Node Type: note [id://1007343]
help
Chatterbox?
 [LanX]: ?

How do I use this? | Other CB clients
Other Users?
Others exploiting the Monastery: (8)
As of 2017-12-15 18:15 GMT
Sections?
Information?
Find Nodes?
Leftovers?
Voting Booth?
What programming language do you hate the most?

Results (440 votes). Check out past polls.

Notices?