Відповіді:
Я не знаю жодного програмного забезпечення. Google теж щось не придумав. Здогадайтесь, це надто проста проблема. Це повинно бути приблизно 30 рядків коду, якщо ви написали його на мові сценаріїв. Ви також можете створити електронну таблицю LibreOffice для цього. Не повинно бути страшенно складно.
Нижче наведено швидкий і брудний сценарій Perl, який я кодував. Ви повинні мати змогу змінити його самостійно. Якщо запустити його perl nameOfTheScript.pl
або зробити його виконуваним, chmod u+x nameOfTheScript.pl
а потім двічі клацнути по ньому, це буде виглядати як на малюнку вище.
#!/usr/bin/perl
# © 2011 con-f-use@gmx.net. Use permitted under MIT license: http://www.opensource.org/licenses/mit-license.php
use Gtk2 '-init'; # relies on the gnome toolkit bindings for perl
$size = 1e5; # fontsize in 0.001 pt (only god knows why)
sub randomizeLabel { #### this does the actual randomisation
$min = int($entry1->get_text);
$max = int($entry2->get_text);
$rand = int(rand($max-$min+1)) + $min;
$diplabel->set_markup( "<span size=\"$size\">$rand</span>" );
}
#### the rest is gui stuff:
$window = Gtk2::Window->new('toplevel');
$window->set_title('Random Integer Generator');
$window->signal_connect(destroy => sub { Gtk2->main_quit; });
$window->signal_connect(delete_event => sub { Gtk2->main_quit; });
$window->set_border_width(10);
$vbox = Gtk2::VBox->new(0, 5); $window->add($vbox); $vbox->show;
$diplabel = Gtk2::Label->new;
$diplabel->set_markup("<span size=\"$size\">0</span>");
$vbox->add($diplabel); $diplabel->show;
$entry1 = Gtk2::Entry->new; $vbox->add($entry1); $entry1->show;
$entry2 = Gtk2::Entry->new; $vbox->add($entry2); $entry2->show;
$button = Gtk2::Button->new("Generate!");
$button->signal_connect(clicked => \&randomizeLabel, $window);
$vbox->add($button); $button->show;
$window->show; Gtk2->main;
exit 0;
ObsessiveFOSS попросив мене включити ще один генератор для випадкових чисел (оскільки саме цей сценарій використовує вбудований Perl). Ви можете побачити ескіз того, як це зробити, в іншій моїй відповіді .
ObsessiveFOSS просили реалізувати Blum та ін. криптографічно захищений генератор псевдовипадкових чисел. Ось мій нарис про те, як це зробити. Інший код залишається таким же, як і в моїй попередній відповіді . Потрібно просто замінити randomizeLabel
підпрограму і замість цього вставити цей код :
use bigint;
# Kinda large primes
$p = 338047573; # Any pair of large primes will suffice here...
$q = 4182249941; #+...as long as they fullfill the congruence check below
$rand = 7; # Seed for the random number generator (x_0 in the wiki)
sub errMsg {
$dialog = Gtk2::MessageDialog->new($window, 'destroy-with-parent', 'error', 'ok', $_[0]);
$dialog->signal_connect (response => sub { exit 1; });
$dialog->run;
}
# Check congruence 3 mod 4 (for quadratic residue)
if( ($p-3)%4 == 0 ) { errMsg('Error: Variable p is ill choosen.'); }
if( ($q-3)%4 == 0 ) { errMsg('Error: Variable q is ill choosen.'); }
# Note: For large cycle lengths gcd(φ(p-1), φ(q-1)) should also be small,...
#+...where φ is Euler's totient function but this is not checked here
# Compute Modulus in Blum Blum Shub
$M = $p*$q;
sub randomizeLabel { # This does the actual randomization
$min = int($entry1->get_text); $max = int($entry2->get_text); # Boundaries for the desired random range from the input filed of the GUI (included for convenience when modifying the script - not used here)
# Blum Blum Shub pseudo random number generator
$rand = ($rand*$rand) % $M;
# Here you have to extract the bits and shift them in range
$randout = $rand & (2**6-1); # Change this line. It's an example and extracts the five least significant bits! To extract the ten LSBs use '(2**11-1)' and so on...
# $randout = ...$min...$max...; # shift it in the right range (not done here)
$diplabel->set_markup( "<span size=\"$size\">$randout</span>" );
}
Як вже було сказано, він є неповним. Можна було б використовувати оператори побітового для вилучення корисних випадкових чисел, зрушення і масштаб їх , щоб відповідати між $min
і $max
. Зараз вхід для мінімуму та максимуму не використовується.
Сьогодні це можна зробити дуже легко з QML:
import QtQuick 2.0
import Ubuntu.Components 0.1
Rectangle {
id: mainView
width: units.gu(30)
height: units.gu(40)
Column {
id: generator
spacing: units.gu(1)
anchors.horizontalCenter: mainView.horizontalCenter
Text {
id: ramdom_number
text: "0"
font.pointSize: 100
anchors.horizontalCenter: generator.horizontalCenter
}
TextField {
id:min
text: "0"
}
TextField {
id: max
text: "100"
}
Button {
text: "Generate!"
width: generator.width
onClicked: ramdom_number.text = Math.floor((Math.random()*(max.text-min.text+1))+min.text);
}
}
}
Запустіть цей код за допомогою qmlscene
: