Generating random number in lammps

I want to generate random number every time, but seems following command is only providing me a constant number.
variable number equal ceil(random(1,1,10)*10000)
print ${number}

That is because you give it a range from 1 to 1.
The number returned is an integer.

So try something like the following:

variable number equal ceil(random(1,1000000000,10)/100000.0)
print ${number}
print ${number}
print ${number}
print ${number}
print ${number}
print ${number}

clear
units metal
boundary p p p
atom_style atomic
atom_modify map array
atom_modify sort 0 0.0
variable lp equal "3.33"
lattice bcc ${lp} orient x 1 0 0 orient y 0 1 0 orient z 0 0 1
region whole block 0 1 0 1 0 1 units lattice
create_box 3 whole
create_atoms 1 region whole
replicate 3 3 3
group iron type 1
variable number equal ceil(random(1,1000000000,10)/100000.0)
print ${number}
set group iron type/fraction 2 0.203703704 ${number}
set group iron type/fraction 3 0.055555556 ${number}
mass * 1
# ---------- Define Interatomic Potential ---------------------
pair_style lj/cut 3.0
pair_coeff * * 1 1

neighbor 2.0 bin
neigh_modify delay 10 check yes
run 0

every time it is printing 2355, I want different number with every run

1 Like

Then you have to use a different seed for each run!

The whole point of having pseudo random number generators with a seed is to make calculations repeatable. If your shell is bash, this can be easily done by using the random number generator embedded in bash.

variable rnseed index 10
variable number equal ceil(random(1,1000000000,${rnseed})/100000.0)
print ${number}

and then using:
./lmp -in in.random -v rnseed $RANDOM

I have to correct my statement. After reviewing the source code, I realize that the reported value from the random function is a double precision floating-point number and not an integer. The problem is, however, giving a range of 1 to 1, which is no range at all. So if you want random numbers between 0 and 1 as it seems you want to get, you would have to use random(0,1,${rnseed}).

Thanks a lot !!!

I just have a similar requirement to generate a random number for each run and here is how I do

shell "date +%s > seed.txt"
variable seed file seed.txt
# The initial seed for this random number generator must be a positive integer less than or equal to 900 million.
variable TEMP equal random(330,430,${seed}%65535)
print "random seed: ${seed}, TEMP: ${TEMP}"

A timer variable could be a good way to generate a random seed as I understand. This seed can be used with a variable random to generate (pseudo?)-irreproducible random number in the desired range.

e.g.:

> variable tmr timer
> variable SEED equal ceil(${tmr}*10000000)
> variable rand1 equal random(-1,1,${SEED})