#c #random #integer #set #intervals
Вопрос:
Задан набор из N целых чисел (все они находятся на расстоянии 1 единицы друг от друга) Я хотел бы создать вектор, используя каждое из этих чисел T раз каждое.
Допустим, X= [1,2,…,N] — это мой набор чисел, и я хочу создать вектор размером T. N таким образом, чтобы каждый x в X появлялся $T$ раз каждый (порядок не имеет значения).
Моя идея заключается в следующем:
Используя оригинальную библиотеку c , я выбираю случайное число из X и сохраняю количество раз, когда это число было выбрано, после того,как некоторые x будут выбраны T раз, я разбиваю набор X на две части, скажем, X1=[1,2,…, x) и X2=(x,…, N]. Поэтому, чтобы случайным образом выбрать следующее число, я генерирую равномерное (0,1) число раньше, если оно больше 1/2, я выбираю новое число поверх X2 и из X1 в противном случае.
Продолжая в том же духе, предположим, что теперь есть K чисел, которые уже были выбраны T раз. Я выберу следующее число из одного из наборов K 1, сгенерированных путем удаления этих выбранных значений. Чтобы выбрать некоторые из этих интервалов, я снова генерирую число (0,1) и «разбиваю» интервал (0,1) на K 1 равные части длины (1/K 1) и соответственно выбираю следующий набор.
Имеет ли это смысл?
Комментарии:
1. вы спрашиваете, как это можно было бы реализовать в C ?
2. Просто добавьте X T раз к себе. И перемешайте результат, если вам нужно случайное распределение.
3. Если генерация этого вектора является шагом к выборке из дискретного распределения, то a
std::discrete_distribution
достигнет выборки, которую вы описываете.
Ответ №1:
Как насчет того, чтобы скопировать список в вектор три раза, а затем рандомизировать? <algorithm>
имеет std::random_shuffle()
и std::shuffle()
.