added option to make random seed automatically generated at simulation load

+ a single random generator instance is used instead of sharing seed between different parts of the simulator
This commit is contained in:
fros4943 2009-02-18 10:09:32 +00:00
parent 07c50cc200
commit 8e9686e01d
3 changed files with 81 additions and 19 deletions

View File

@ -24,7 +24,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: GUI.java,v 1.102 2009/02/08 18:33:05 fros4943 Exp $
* $Id: GUI.java,v 1.103 2009/02/18 10:09:32 fros4943 Exp $
*/
package se.sics.cooja;
@ -592,7 +592,7 @@ public class GUI extends Observable {
JMenuItem menuItem2 = new JMenuItem("same random seed");
menuItem2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
reloadCurrentSimulation(false, false);
reloadCurrentSimulation(false, getSimulation().getRandomSeed());
}
});
menuItem.add(menuItem2);
@ -600,7 +600,7 @@ public class GUI extends Observable {
menuItem2 = new JMenuItem("new random seed");
menuItem2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
reloadCurrentSimulation(false, true);
reloadCurrentSimulation(false, getSimulation().getRandomSeed()+1);
}
});
menuItem.add(menuItem2);
@ -2389,7 +2389,7 @@ public class GUI extends Observable {
* @param autoStart Start executing simulation when loaded
* @param newSeed Change simulation seed
*/
public void reloadCurrentSimulation(final boolean autoStart, final boolean newSeed) {
public void reloadCurrentSimulation(final boolean autoStart, final long randomSeed) {
if (getSimulation() == null) {
logger.fatal("No simulation to reload");
return;
@ -2402,9 +2402,6 @@ public class GUI extends Observable {
/* Get current simulation configuration */
Element root = new Element("simconf");
Element simulationElement = new Element("simulation");
if (newSeed) {
getSimulation().setRandomSeed(getSimulation().getRandomSeed() + 1);
}
simulationElement.addContent(getSimulation().getConfigXML());
root.addContent(simulationElement);
@ -2421,6 +2418,8 @@ public class GUI extends Observable {
myGUI.doRemoveSimulation(false);
Simulation newSim = loadSimulationConfig(root, true);
myGUI.setSimulation(newSim);
myGUI.getSimulation().setRandomSeed(randomSeed);
if (autoStart) {
newSim.startSimulation();
}
@ -2486,7 +2485,7 @@ public class GUI extends Observable {
* @param autoStart Start executing simulation when loaded
*/
public void reloadCurrentSimulation(boolean autoStart) {
reloadCurrentSimulation(autoStart, false);
reloadCurrentSimulation(autoStart, getSimulation().getRandomSeed());
}
/**

View File

@ -24,7 +24,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id: Simulation.java,v 1.37 2009/01/08 15:42:38 fros4943 Exp $
* $Id: Simulation.java,v 1.38 2009/02/18 10:09:59 fros4943 Exp $
*/
package se.sics.cooja;
@ -74,9 +74,11 @@ public class Simulation extends Observable implements Runnable {
private long randomSeed = 123456;
private boolean randomSeedGenerated = false;
private int maxMoteStartupDelay = 1000;
private Random delayMotesRandom = new Random();
private Random randomGenerator = new Random();
// Tick observable
private class TickObservable extends Observable {
@ -276,7 +278,6 @@ public class Simulation extends Observable implements Runnable {
*/
public Simulation(GUI gui) {
myGUI = gui;
delayMotesRandom.setSeed(randomSeed);
}
/**
@ -342,6 +343,26 @@ public class Simulation extends Observable implements Runnable {
*/
public void setRandomSeed(long randomSeed) {
this.randomSeed = randomSeed;
randomGenerator.setSeed(randomSeed);
logger.info("Simulation random seed: " + randomSeed);
}
/**
* @param generated Autogenerated random seed at simulation load
*/
public void setRandomSeedGenerated(boolean generated) {
this.randomSeedGenerated = generated;
}
/**
* @return Autogenerated random seed at simulation load
*/
public boolean getRandomSeedGenerated() {
return randomSeedGenerated;
}
public Random getRandomGenerator() {
return randomGenerator;
}
/**
@ -386,7 +407,11 @@ public class Simulation extends Observable implements Runnable {
// Random seed
element = new Element("randomseed");
element.setText(Long.toString(randomSeed));
if (randomSeedGenerated) {
element.setText("generated");
} else {
element.setText(Long.toString(getRandomSeed()));
}
config.add(element);
// Max mote startup delay
@ -467,8 +492,12 @@ public class Simulation extends Observable implements Runnable {
// Random seed
if (element.getName().equals("randomseed")) {
randomSeed = Long.parseLong(element.getText());
delayMotesRandom.setSeed(randomSeed);
if (element.getText().equals("generated")) {
randomSeedGenerated = true;
setRandomSeed(new Random().nextLong());
} else {
setRandomSeed(Long.parseLong(element.getText()));
}
}
// Max mote startup delay
@ -602,7 +631,9 @@ public class Simulation extends Observable implements Runnable {
}
if (maxMoteStartupDelay > 0 && mote.getInterfaces().getClock() != null) {
mote.getInterfaces().getClock().setDrift(-delayMotesRandom.nextInt(maxMoteStartupDelay));
mote.getInterfaces().getClock().setDrift(
-randomGenerator.nextInt(maxMoteStartupDelay)
);
}
currentRadioMedium.registerMote(mote, this);

View File

@ -26,7 +26,7 @@
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $Id: CreateSimDialog.java,v 1.14 2008/12/04 14:03:42 joxe Exp $
* $Id: CreateSimDialog.java,v 1.15 2009/02/18 10:10:47 fros4943 Exp $
*/
package se.sics.cooja.dialogs;
@ -34,8 +34,10 @@ package se.sics.cooja.dialogs;
import java.awt.*;
import java.awt.event.*;
import java.text.*;
import java.util.Random;
import java.util.Vector;
import javax.swing.*;
import org.apache.log4j.Logger;
import se.sics.cooja.*;
@ -61,6 +63,7 @@ public class CreateSimDialog extends JDialog {
private JFormattedTextField delayTime, simulationTime, tickTime;
private JFormattedTextField randomSeed, tickLists, delayedStartup;
private JCheckBox randomSeedGenerated;
private JTextField title;
private JComboBox radioMediumBox;
@ -146,7 +149,14 @@ public class CreateSimDialog extends JDialog {
}
// Set random seed
myDialog.randomSeed.setValue(new Long(simulationToConfigure.getRandomSeed()));
if (simulationToConfigure.getRandomSeedGenerated()) {
myDialog.randomSeedGenerated.setSelected(true);
myDialog.randomSeed.setEnabled(false);
myDialog.randomSeed.setText("[autogenerated]");
} else {
myDialog.randomSeed.setEnabled(true);
myDialog.randomSeed.setValue(new Long(simulationToConfigure.getRandomSeed()));
}
// Set delayed mote startup time
myDialog.delayedStartup.setValue(new Integer(simulationToConfigure.getDelayedMoteStartupTime()));
@ -375,10 +385,25 @@ public class CreateSimDialog extends JDialog {
numberField.setColumns(4);
randomSeed = numberField;
randomSeedGenerated = new JCheckBox();
randomSeedGenerated.setToolTipText("Autmatically generate random seed at simulation load");
randomSeedGenerated.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if (((JCheckBox)e.getSource()).isSelected()) {
randomSeed.setEnabled(false);
randomSeed.setText("[autogenerated]");
} else {
randomSeed.setEnabled(true);
randomSeed.setValue(new Integer(123456));
}
}
});
horizBox.add(label);
horizBox.add(Box.createHorizontalStrut(150));
horizBox.add(numberField);
horizBox.setToolTipText("Main random seed. Determines mote tick order, mote startup delay etc.");
horizBox.add(randomSeedGenerated);
horizBox.setToolTipText("Simulation random seed. Controls the random behavior such as mote startup delays, node positions etc.");
advancedBox.add(horizBox);
advancedBox.add(Box.createVerticalStrut(5));
@ -422,7 +447,14 @@ public class CreateSimDialog extends JDialog {
}
}
mySimulation.setRandomSeed(((Number) randomSeed.getValue()).longValue());
if (randomSeedGenerated.isSelected()) {
mySimulation.setRandomSeedGenerated(true);
mySimulation.setRandomSeed(new Random().nextLong());
} else {
mySimulation.setRandomSeedGenerated(false);
mySimulation.setRandomSeed(((Number) randomSeed.getValue()).longValue());
}
mySimulation.setDelayedMoteStartupTime(((Number) delayedStartup.getValue()).intValue());
dispose();