Это сложно, как вы ожидали, из-за необходимости отбора проб без замены. Ниже приведено рабочее решение, которое позволяет получить случайную выборку и быстро решить проблему масштаба, приведенную в примере с вашей игрушкой. Это также должно быть хорошо с большим количеством наблюдений, но будет действительно очень медленным, если вам нужно будет выбрать много точек относительно размера выборки.
Основная предпосылка состоит в том, чтобы выбрать n = 10 точек, сгенерировать 10 векторов из этих точек вперед, и если векторы пересекаются, отбросить их и выбрать снова. Это просто и прекрасно работает, учитывая, что 10*n << nrow(df)
. Если вы хотите получить 15 подвекторов из ваших 200 наблюдений, это будет намного медленнее.
library(tidyverse)
library(lubridate)
date_data <- tibble(dates = c(seq(ymd("2015-03-22"),
ymd("2015-07-03"),
by = "days"),
seq(ymd("2015-08-09"),
ymd("2015-10-01"),
by = "days"),
seq(ymd("2015-11-12"),
ymd("2016-01-03"),
by = "days")),
sample_id = 0L)
# A function that picks n indices, projects them forward 10,
# and if any of the segments overlap resamples
pick_n_vec <- function(df, n = 10, out = 10) {
points <- sample(nrow(df) - (out - 1), n, replace = F)
vecs <- lapply(points, function(i){i:(i+(out - 1))})
while (max(table(unlist(vecs))) > 1) {
points <- sample(nrow(df) - (out - 1), n, replace = F)
vecs <- lapply(points, function(i){i:(i+(out - 1))})
}
vecs
}
# demonstrate
set.seed(42)
indices <- pick_n_vec(date_data)
for (i in 1:10) {
date_data$sample_id[indices[[i]]] <- i
}
date_data[indices[[1]], ]
#> # A tibble: 10 x 2
#> dates sample_id
#>
#> 1 2015-05-31 1
#> 2 2015-06-01 1
#> 3 2015-06-02 1
#> 4 2015-06-03 1
#> 5 2015-06-04 1
#> 6 2015-06-05 1
#> 7 2015-06-06 1
#> 8 2015-06-07 1
#> 9 2015-06-08 1
#> 10 2015-06-09 1
table(date_data$sample_id)
#>
#> 0 1 2 3 4 5 6 7 8 9 10
#> 111 10 10 10 10 10 10 10 10 10 10
Создано в 2019-01-16 с помощью пакета представитель (v0.2.1) sup>
pick_n_vec2 <- function(df, n = 10, out = 10) {
points <- sample(nrow(df) - (out - 1), n, replace = F)
while (min(diff(sort(points))) < 10) {
points <- sample(nrow(df) - (out - 1), n, replace = F)
}
lapply(points, function(i){i:(i+(out - 1))})
}
import java.security.GeneralSecurityException;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import javax.crypto.Cipher;
public class RSACrypto
{
/* A 1024-bit key will encrypt messages up to 117 bytes long. */
private static final int KEY_SIZE = 1024;
private static final String XFORM =
"RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING";
public static KeyPair generateRSAKeyPair()
throws GeneralSecurityException
{
KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
gen.initialize(KEY_SIZE);
return gen.generateKeyPair();
}
public static byte[] encrypt(byte[] plaintext, PublicKey pub)
throws GeneralSecurityException
{
Cipher cipher = Cipher.getInstance(XFORM);
cipher.init(Cipher.ENCRYPT_MODE, pub);
return cipher.doFinal(plaintext);
}
public static byte[] decrypt(byte[] ciphertext, PrivateKey pvt)
throws GeneralSecurityException
{
Cipher cipher = Cipher.getInstance(XFORM);
cipher.init(Cipher.DECRYPT_MODE, pvt);
return cipher.doFinal(ciphertext);
}
public static void main(String... argv)
throws Exception
{
KeyPair pair = RSACrypto.generateRSAKeyPair();
byte[] plaintext = "A short secret message.".getBytes("UTF-8");
byte[] ciphertext = RSACrypto.encrypt(plaintext, pair.getPublic());
byte[] recovered = RSACrypto.decrypt(ciphertext, pair.getPrivate());
System.out.println(new String(recovered, "UTF-8"));
}
}
хм, Вы попробовали книгу O'Reilly по Криптографии Java? (не может ручаться за него лично),
IMHO следует дождаться, пока Visual Studio 2010 и WPF 4.0 выполнят фактическую миграцию. Они закроют некоторые очень раздражающие пробелы в продукте.
Тем временем вы можете опробовать его. С точки зрения кодирования/читаемости - это будет WAAAY лучше, чем с MFC =)
Что касается производительности и платформы - это не должно быть проблемой, если у вас нет каких-либо особых обстоятельств (например, если вы не можете потребовать от пользователей установки .NET).
См. также соответствующий вопрос о переключении на WPF из Windows Forms .
-121--332530- В качестве аргумента можно использовать метод Последовательностей
класса = ~
с параметром regex /\d/
.
Вот пример:
s = 'abc123'
if s =~ /\d/ # Calling String's =~ method.
puts "The String #{s} has a number in it."
else
puts "The String #{s} does not have a number in it."
end
-121--2623116- import java.security.GeneralSecurityException;
import java.security.KeyFactory;
import java.security.KeyPairGenerator;
import java.security.PublicKey;
import java.security.interfaces.RSAPrivateKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import javax.crypto.Cipher;
public class RsaCrypto {
private static final int KEY_SIZE = 3072;
private static final String TRANSFORMATION = "RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING";
public static KeyPair generateRSAKeyPair() {
try {
KeyPairGenerator gen = KeyPairGenerator.getInstance("RSA");
gen.initialize(KEY_SIZE);
java.security.KeyPair p = gen.generateKeyPair();
KeyPair pair = new KeyPair();
pair.privateKey = p.getPrivate().getEncoded();
pair.publicKey = p.getPublic().getEncoded();
return pair;
} catch (GeneralSecurityException e) {
throw new RuntimeException(e);
}
}
public static byte[] encrypt(byte[] data, byte[] publicKey) {
X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKey);
try {
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey pk = kf.generatePublic(publicKeySpec);
Cipher rsa = Cipher.getInstance(TRANSFORMATION);
rsa.init(Cipher.ENCRYPT_MODE, pk);
return rsa.doFinal(data);
} catch (GeneralSecurityException e) {
throw new RuntimeException(e);
}
}
public static byte[] decrypt(byte[] encryptedData, byte[] privateKey) {
try {
PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(privateKey);
RSAPrivateKey pk = (RSAPrivateKey) KeyFactory.getInstance("RSA")
.generatePrivate(privSpec);
Cipher rsaCipher = Cipher.getInstance(TRANSFORMATION);
rsaCipher.init(Cipher.DECRYPT_MODE, pk);
return rsaCipher.doFinal(encryptedData);
} catch (GeneralSecurityException e) {
throw new RuntimeException(e);
}
}
}