Sidhant
Sidhant

Reputation: 441

Scala Shuffle A List Randomly And repeat it

I want to shuffle a scala list randomly.

I know i can do this by using scala.util.Random.shuffle

But here by calling this i will always get a new set of list. What i really want is that in some cases i want the shuffle to give me the same output always. So how can i achieve that?

Basically what i want to do is to shuffle a list randomly at first and then repeat it in the same order. For the first time i want to generate the list randomly and then based on some parameter repeat the same shuffling.

Upvotes: 1

Views: 2132

Answers (2)

jwvh
jwvh

Reputation: 51271

Use setSeed() to seed the generator before shuffling. Then if you want to repeat a shuffle reuse the seed.

For example:

scala> util.Random.setSeed(41L)  // some seed chosen for no particular reason

scala> util.Random.shuffle(Seq(1,2,3,4))
res0: Seq[Int] = List(2, 4, 1, 3)

That shuffled: 1st -> 3rd, 2nd -> 1st, 3rd -> 4th, 4th -> 2nd

Now we can repeat that same shuffle pattern.

scala> util.Random.setSeed(41L)  // same seed

scala> util.Random.shuffle(Seq(2,4,1,3))  // result of previous shuffle
res1: Seq[Int] = List(4, 3, 2, 1)

Upvotes: 6

Hamuel
Hamuel

Reputation: 633

Let a be the seed parameter Let b be the how many time you want to shuffle

There are two ways to kinda of do this

you can use scala.util.Random.setSeed(a) where 'a' can be any integer so after you finish your shuffling b times you can set the 'a' seed again and then your shuffling will be in the same order as your parameter 'a'

The other way is to shuffle List(1,2,3,...a) == 1 to a b times save that as a nested list or vector and then you can map it to your iterable

val arr = List(Bob, Knight, John)
val randomer = (0 to b).map(x => scala.util.Random.shuffle((0 to arr.size))

randomer.map(x => x.map(y => arr(y)))  

You can use the same randomer for you other list you want to shuffle by mapping it

Upvotes: 1

Related Questions