2015-07-16 7 views
15

Come documentation says:Perché non sono presenti `std :: uniform_int_distribution <uint8_t>` e `std :: uniform_int_distribution <int8_t>` Consentito?

L'effetto è indefinito se questo non è uno dei short, int, long, long long, unsigned short, unsigned int, unsigned long o unsigned long long.

Se non mi interessa l'intervallo, posso semplicemente mascherare i bit di un tipo più grande per generare numeri casuali. In caso contrario, è più complesso. Perché i tipi di byte non sono forniti solo per impostazione predefinita?

+0

Non è 'int8_t' - se l'implementazione lo fornisce a tutti - necessariamente un' typedef' a uno degli interi elencati? – 5gon12eder

+1

@ 5gon12eder è probabile che sia stato firmato char che in effetti manca da quella lista. –

+1

[Ho chiesto _std-discussion_ su questo una volta] (https://groups.google.com/a/isocpp.org/d/msg/std-discussion/rOzm69RSNcg/aIqYf__XJb0J). –

risposta

12

C'è una biblioteca gruppo di lavoro questione irrisolta su questo uniform_int_distribution<unsigned char> should be permitted e dice, tra le altre cose:

io non sono a conoscenza di nulla in <random> che funziona con 16 bit interi, ma non riesce con 8- bit interi, quindi sospetto che IntType e UIntType possano essere semplicemente estesi per consentire la famiglia di caratteri. In alternativa, questa modifica potrebbe essere limitata a uniform_int_distribution da solo, dove è sicuramente sicuro. Un esperto di <random> dovrebbe decidere quale modifica è la migliore.

La soluzione proposta è modificare la restrizione per permettere tipi interi standard:

che ha un parametro di tipo modello definito IntType è indefinito meno l'argomento modello corrispondente è cv-qualificato ed è aa tipo standard intero (3.9.1 [basic.fundamental]

e:

che ha un parametro di tipo di modello di nome UIntType è indefinito meno che l'argomento del modello corrispondente è cv-qualificato ed è un tipo standard di intero senza segno (3.9.1 [basic.fundamental])

In questo modo si ottiene unsigned/firmato char anche se non uint8_t o int8_t ma sono probabilmente equivalenti. Sono stati esclusi i tipi integrali estesi per semplificare la formulazione e massimizzare il consenso:

Questo esclude anche i tipi di integrale esteso e i tipi di caratteri wide, che sembrano molto belli da avere. Non ho alcuna obiezione a sostenere nessuno di questi tipi; Ho scelto questo per semplificare la formulazione e, si spera, massimizzare il consenso.

Nota, questo esclude char dal momento che è l'attuazione definito se char è firmato o meno.

Nota questo argomento è stato richiamato anche nello std-discussion list.

Jonathan Wakely nota questa proposta è controversa e ha commentato che le sue note dall'ultima discussione sono i seguenti:

che era molto sicuramente intenzionale che interi singolo byte non sono supportati, non un'omissione accidentale, e quindi dovremmo essere attenti solo cambiando che senza consultare i progettisti del C++ 11

Egli suggerisce di aggiungere un membro per random_device per fornire singoli byte, che è sembra una ragionevole alternativa.

+0

Il cambiamento proposto è abbastanza controverso. Ho suggerito che se ciò che è veramente voluto è una fonte di byte casuali (che sembra sia ciò che le persone realmente vogliono quando lo chiedono) allora un'interfaccia alternativa per ottenere N byte casuali sarebbe meglio che rendere ogni supporto di distribuzione interi di 1 byte . –

+0

@JonathanWakely grazie per il commento, puoi spiegare qual è il problema? La tua proposta ha molto senso, mi chiedo solo perché la proposta di risoluzione è problematica. –

+3

Le mie note dell'ultima discussione dicono che era decisamente intenzionale che i numeri interi a byte singolo non siano supportati, non un'omissione accidentale, e quindi dovremmo fare attenzione a cambiarlo senza consultare i progettisti del C++ 11 '' strutture. Il mio suggerimento era di aggiungere una funzione membro a 'random_device' per ottenere byte casuali, e non toccare alcun motore o distribuzione. È probabile che funzioni molto meglio dell'estrazione di un byte alla volta da una distribuzione. –