Как Вы генерируете случайное число в C#?

Что касается основного вопроса в этом потоке, другие сообщения дали понять, почему мы не можем привязывать значения к именам столбцов при подготовке операторов, так что вот одно из решений:

class myPdo{
    private $user   = 'dbuser';
    private $pass   = 'dbpass';
    private $host   = 'dbhost';
    private $db = 'dbname';
    private $pdo;
    private $dbInfo;
    public function __construct($type){
        $this->pdo = new PDO('mysql:host='.$this->host.';dbname='.$this->db.';charset=utf8',$this->user,$this->pass);
        if(isset($type)){
            //when class is called upon, it stores column names and column types from the table of you choice in $this->dbInfo;
            $stmt = "select distinct column_name,column_type from information_schema.columns where table_name='sometable';";
            $stmt = $this->pdo->prepare($stmt);//not really necessary since this stmt doesn't contain any dynamic values;
            $stmt->execute();
            $this->dbInfo = $stmt->fetchAll(PDO::FETCH_ASSOC);
        }
    }
    public function pdo_param($col){
        $param_type = PDO::PARAM_STR;
        foreach($this->dbInfo as $k => $arr){
            if($arr['column_name'] == $col){
                if(strstr($arr['column_type'],'int')){
                    $param_type = PDO::PARAM_INT;
                    break;
                }
            }
        }//for testing purposes i only used INT and VARCHAR column types. Adjust to your needs...
        return $param_type;
    }
    public function columnIsAllowed($col){
        $colisAllowed = false;
        foreach($this->dbInfo as $k => $arr){
            if($arr['column_name'] === $col){
                $colisAllowed = true;
                break;
            }
        }
        return $colisAllowed;
    }
    public function q($data){
        //$data is received by post as a JSON object and looks like this
        //{"data":{"column_a":"value","column_b":"value","column_c":"value"},"get":"column_x"}
        $data = json_decode($data,TRUE);
        $continue = true;
        foreach($data['data'] as $column_name => $value){
            if(!$this->columnIsAllowed($column_name)){
                 $continue = false;
                 //means that someone possibly messed with the post and tried to get data from a column that does not exist in the current table, or the column name is a sql injection string and so on...
                 break;
             }
        }
        //since $data['get'] is also a column, check if its allowed as well
        if(isset($data['get']) && !$this->columnIsAllowed($data['get'])){
             $continue = false;
        }
        if(!$continue){
            exit('possible injection attempt');
        }
        //continue with the rest of the func, as you normally would
        $stmt = "SELECT DISTINCT ".$data['get']." from sometable WHERE ";
        foreach($data['data'] as $k => $v){
            $stmt .= $k.' LIKE :'.$k.'_val AND ';
        }
        $stmt = substr($stmt,0,-5)." order by ".$data['get'];
        //$stmt should look like this
        //SELECT DISTINCT column_x from sometable WHERE column_a LIKE :column_a_val AND column_b LIKE :column_b_val AND column_c LIKE :column_c_val order by column_x
        $stmt = $this->pdo->prepare($stmt);
        //obviously now i have to bindValue()
        foreach($data['data'] as $k => $v){
            $stmt->bindValue(':'.$k.'_val','%'.$v.'%',$this->pdo_param($k));
            //setting PDO::PARAM... type based on column_type from $this->dbInfo
        }
        $stmt->execute();
        return $stmt->fetchAll(PDO::FETCH_ASSOC);//or whatever
    }
}
$pdo = new myPdo('anything');//anything so that isset() evaluates to TRUE.
var_dump($pdo->q($some_json_object_as_described_above));

Вышеуказанное это просто пример, поэтому, разумеется, copy-> paste не будет работать. Отрегулируйте для ваших потребностей. Теперь это может не обеспечить 100% -ную защиту, но позволяет контролировать имена столбцов, когда они «входят» как динамические строки и могут быть изменены в конце пользователя. Кроме того, нет необходимости создавать какой-либо массив с именами и типами столбцов таблицы, поскольку они извлекаются из information_schema.

33
задан MrValdez 5 October 2008 в 06:05
поделиться

6 ответов

Единственной вещью, которую я добавил бы к ответ Eric , является объяснение; я чувствую, что знание того, почему код работает, лучше, чем знание, какой код работает.

объяснение - это: скажем, Вы хотите число между 2,5 и 4.5. Диапазон 2.0 (4.5 - 2.5). NextDouble только возвраты число между 0 и 1.0, но если Вы умножаете это на диапазон, Вы получите число между 0 и диапазонами .

Так, это дало бы нам случайный, удваивается между 0,0 и 2.0:

rng.NextDouble() * 2.0

, Но, мы хотим их между 2,5 и 4.5! Как мы делаем это? Добавьте самое маленькое количество, 2.5:

2.5 + rng.NextDouble() * 2.0

Теперь, мы получаем число между 0,0 и 2.0; если Вы добавляете 2.5 к каждому из этих значений, мы видим, что диапазон теперь между 2,5 и 4.5.

Сначала я думал, что имело значение, если b> a или a> b, но если Вы работаете он оба способа, которыми Вы найдете, это удается тождественно, пока Вы не портите порядок используемых переменных. Мне нравится выражать его более длинными именами переменной, таким образом, я не становлюсь перепутанным:

double NextDouble(Random rng, double min, double max)
{
    return min + (rng.NextDouble() * (max - min));
}
60
ответ дан Community 11 October 2019 в 08:00
поделиться
// generate a random number starting with 5 and less than 15
Random r = new Random();
int num = r.Next(5, 15);  

Для удваивается, можно заменить Затем NextDouble

2
ответ дан Ryan Farley 11 October 2019 в 08:00
поделиться

Как случайный? Если можно иметь дело с псевдослучайным тогда просто:

Random randNum = new Random();
randNum. NextDouble(Min, Max);

, Если Вы хотите "лучшее" случайное число, тогда, вероятно, необходимо посмотреть на алгоритм Вихря Мерсенна. Много людей имеет , уже реализовал его для Вас хотя

1
ответ дан enigmatic 11 October 2019 в 08:00
поделиться

Для explaination того, почему Лонгхорн был downmodded так: http://msdn.microsoft.com/en-us/magazine/cc163367.aspx Ищет реализацию NextDouble и объяснение того, что является случайным дважды.

, Что ссылка является также примером липкой вещи того, как использовать криптографические случайные числа (как упомянутый Sameer) только с фактическими полезными выводами вместо небольшого потока.

1
ответ дан Andrew Burns 11 October 2019 в 08:00
поделиться
System.Random r = new System.Random();

double rnd( double a, double b )
{
   return a + r.NextDouble()*(b-a);
}
20
ответ дан Eric 11 October 2019 в 08:00
поделиться

Вот отрывок того, как получить Криографически безопасные случайные числа: Это заполнит 8 байтов с crytographically сильной последовательностью случайных значений.

byte[] salt = new byte[8];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(salt);

для получения дополнительной информации видят , Насколько Случайный Ваше Случайное??" (вдохновленный статьей CodingHorror о перестановке деки)

1
ответ дан Sameer 11 October 2019 в 08:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: