Графический генератор случайных чисел

10

Существует ли генератор случайных чисел для Linux с приятным графическим интерфейсом, который может генерировать случайное целое число между двумя целыми числами и отображать его с большим размером шрифта?

ученик
источник
Что вы собираетесь делать? Ментальная математика?
BigSack

Ответы:

36

Я не знаю никакого программного обеспечения. Google тоже ничего не придумал. Думаю, это слишком простая проблема. Это должно быть около 30 строк кода, если вы написали это на языке сценариев. Вы также можете создать электронную таблицу LibreOffice, чтобы сделать это. Не должно быть ужасно сложно.

Изменить 1:

генератор псевдослучайных чисел - Perl GUI скрипт

Ниже приведен быстрый и грязный скрипт на 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;

Edit2

ObsessiveFOSS попросил меня включить другой генератор для случайных чисел (так как этот скрипт использует встроенный Perl). Вы можете увидеть эскиз, как это сделать, в моем другом ответе .

кон-F-использование
источник
9
+1 - тот факт, что ты достаточно заботился, чтобы написать сценарий, делает это удивительно.
JRG
4
Приятно видеть, что вы потратили время на предоставление сценария для этого. Большой!
Самараса
Рад, что вам это нравится.
con-f-use
@ con-f-use было бы неплохо, если бы вы могли выпустить его в лицензии gpl.
Линсити
@Alaukik Согласен ли ты с MIT License? Это более разрешающее и совместимое с GPL?
con-f-use
4

ObsessiveFOSS попросили внедрить Blum, et al. криптографически безопасный генератор псевдослучайных чисел. Вот мой набросок о том, как это сделать. Другой код остается таким же, как в моем предыдущем ответе . Нужно просто заменить 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. Прямо сейчас ввод для минимума и максимума не используется.

кон-F-использование
источник
Я подозреваю, что есть модуль Perl для CSPRNG, который делает лучше, чем мой скрипт.
con-f-use
1

Сегодня это очень легко сделать с помощью 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:

введите описание изображения здесь

Сильвен Пино
источник