#!/usr/bin/perl # file to generate a randomisation of a set of sequential numbers, leans heavily on: ## $Header: /cys/people/brenner/http/docs/web/perl5/RCS/simple-form.cgi,v 1.5 1996/03/29 22:58:40 brenner Exp $ ## Copyright (C) 1994 Steven E. Brenner ## This is a small demonstration script to demonstrate the use of the cgi-lib.pl library # this file was written by Chris Evans (C.Evans@sghms.ac.uk) and I claim copyright on it but # anyone is welcome to use it and adapt it provided: # a) you let me know # b) you credit me like this # c) you retain these conditions # d) you don't make any money out of it (without sharing with me!) # # the correct citation for this file is: # Evans (1997) random1.prl http://www.psyctc.org/scripts/random1.prl # 9.ii.97 require 5.001; use strict; require "cgi-lib.pl"; MAIN: { my (%input, # The CGI data then the following are munged $upper, # upper end of sequence $lower, # lower end of sequence $diff, # difference between those $seed, # seed $current, # latest number generated $test, # a flag variable %used, # array flagging whether $current has been done already $dump, # flag variable $i, # counter $field); # Each of the fields (used for testing) # Read in all the variables set by the form &ReadParse(\%input); # Check that everything has been entered foreach $field (qw(lowest highest seed)) { &CgiDie("Error: Missing field '$field'\n") unless defined $input{$field}; } # Print the header print &PrintHeader; print &HtmlTop ("Random numbers as permuted with seed $input{'seed'}"); # Do some processing, and print some output $upper = $input{'highest'}; $lower = $input{'lowest'}; $seed = $input{'seed'}; $test = 0; $diff = $upper - $lower; if ($diff < 1) { print "Upper number MUST be at least one bigger than lower\n"; print "Use "back" in your browser to go back and try again\n"; exit; } # now set up associative array to # keep track of numbers you've used for ($i = $lower; $i <= $upper; $i++) { $used{$i} = 1; } srand($seed); $dump = $lower + int(rand($diff + 1)); while ($test < $diff) { # perl random number generator rand(x) # returns fractional number between # 0 and x $current = $lower + int(rand($diff + 1)); if ($used{$current} == 1) { # hasn't already been used $used{$current} = 0; $test++; print "$current\n"; } } # now find the one unused number for ($i = $lower; $i <= $upper; $i++) { if ($used{$i} == 1) { print "$i\n"; last; # exit the loop } } # Close the document cleanly. print &HtmlBot; }