Generatore casuale grafico


10

Esiste un generatore casuale per Linux con una bella interfaccia grafica, che può generare un numero intero casuale tra due numeri interi e visualizzarlo con un carattere di grandi dimensioni?


Cosa farai? Matematica mentale?
BigSack

Risposte:


36

Non conosco alcun software. Anche Google non ha inventato qualcosa. Immagino che questo sia un problema troppo semplice. Dovrebbe essere di circa 30 righe di codice se lo hai scritto in un linguaggio di scripting. Per farlo, puoi anche creare un foglio di calcolo di LibreOffice. Non dovrebbe essere tremendamente difficile.

Modifica 1:

generatore di numeri pseudo-casuali - script perl gui

Di seguito è riportato uno script perl veloce e sporco che ho codificato. Dovresti essere in grado di modificarlo da solo. Quando lo esegui perl nameOfTheScript.plo lo rendi eseguibile con chmod u+x nameOfTheScript.ple poi fai doppio clic su di esso, apparirà come nell'immagine sopra.

#!/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 mi ha chiesto di includere un altro generatore di numeri casuali (dato che questo script usa quello incorporato di Perl). Puoi vedere uno schizzo su come farlo nella mia altra risposta .


9
+1 - il fatto che ti sia importato abbastanza da scrivere una sceneggiatura per farlo è sorprendente.
jrg

4
È bello vedere che hai dedicato del tempo a fornire uno script per questo. Grande!
samarasa,

Contento che ti piaccia.
con-f-use

@ con-f-use sarebbe bello se potessi rilasciarlo nella licenza gpl.
Lincity,

@Alaukik La licenza del MIT andrebbe bene anche per te. È più permissivo e compatibile con GPL?
con-f-use

4

ObsessiveFOSS ha chiesto di implementare Blum, et al. generatore di numeri pseudo-casuali sicuro crittograficamente. Ecco il mio schizzo su come farlo. L'altro codice rimane lo stesso della mia risposta precedente . Basta sostituire la randomizeLabelsubroutine e inserire invece questo codice :

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>" );
}

Come accennato, è incompleto. Uno dovrebbe usare operatori bit per bit per estrarre utili numeri casuali, spostarli e ridimensionarli per adattarsi tra $mine $max. Al momento l'input per il minimo e il massimo non è utilizzato.


Sospetto che esista un modulo Perl per CSPRNG che fa un lavoro migliore del mio script.
con-f-use

1

Oggi si può fare molto facilmente con 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);
        }
    }
}

Esegui questo codice con qmlscene:

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.