TinyMT示例初始化,用法

时间:2017-09-12 09:45:28

标签: c random

使用TinyMT时,我的C代码出现问题。 我想要解释函数如何工作,并希望他们想要他们的参数。

我的linter已经抛出错误:(

public class ApiClientPost {

private static final String BASE_URL = "http://BASE.URL/api/";
private static Retrofit retrofit = null;

public static Retrofit getClient(){


    if(retrofit == null){
        retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
    }
    return retrofit;
}
}

public interface ApiInterface {
    @Multipart
    @Headers({
            "content-type: multipart/form-data"
    })
    @POST("eclaims/UploadFiles")
    Call<JsonElement> UploadFiles(@Part MultipartBody.Part body);
}

FileInputStream fin = null;
        try {
            fin = new FileInputStream(file);
            BufferedInputStream bis = new BufferedInputStream(fin);
            DataInputStream dis = new DataInputStream(bis);
            fileContent = toByteArray(dis);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        MediaType mediaType = MediaType.parse("video/mp4");
        RequestBody requestFile =
                RequestBody.create(mediaType,
                        file
                );
        MultipartBody.Part body =
                MultipartBody.Part.createFormData("", file.getName(), 
       requestFile);

ApiInterface apiInterface = 
ApiClientPost.getClient().create(ApiInterface.class);
            Call<JsonElement> uploadFile = apiInterface.UploadFiles(body);
            uploadFile.enqueue(new Callback<JsonElement>() {
                @Override
                public void onResponse(Call<JsonElement> call, 
Response<JsonElement> response) {
                    if (response.isSuccessful()) {
                        JsonElement mainResponse = response.body();
                        Log.d("Response ===", mainResponse.toString());
                    } else {
                        Log.e("Response ===", "Failed");
                    }
                }

                @Override
                public void onFailure(Call<JsonElement> call, Throwable t) {
                    Log.e("Failed ===", t.getMessage());
                }
            });

TinyMT库被用来随机生成数字,没有关于如何使用它的文档,如果有人可以给我一个如何使用这个神奇工具的指示,我很乐意!

提前谢谢

1 个答案:

答案 0 :(得分:0)

让我们看一下source code中的评论:

/**
 * This function initializes the internal state array with a 64-bit
 * unsigned integer seed.
 * @param random tinymt state vector.
 * @param seed a 64-bit unsigned integer used as a seed.
 */
void tinymt64_init(tinymt64_t * random, uint64_t seed)

相应的header file也说:

/**
 * This function outputs 64-bit unsigned integer from internal state.
 * @param random tinymt internal status
 * @return 64-bit unsigned integer r (0 <= r < 2^64)
 */
inline static uint64_t tinymt64_generate_uint64(tinymt64_t * random)

后者位于头文件(和inline static)中,因为它非常简单,原作者想让C编译器清楚地知道函数可以内联(因而额外的“成本”) “应避免使用函数调用。”

没有函数来获取随机种子(无符号64位整数),因此PRNG将产生相同的随机数序列,或者我们需要以某种方式自己生成合适的种子

让我们将上述注释实现为示例程序。为简单起见,我们使用固定种子1

#include <stdlib.h>
#include <inttypes.h>
#include <stdio.h>
#include "tinymt64.h"

int main(void)
{
    uint64_t    seed = UINT64_C(1);
    uint64_t    value;
    tinymt64_t  prng;

    tinymt64_init(&prng, seed);

    value = tinymt64_generate_uint64(&prng);

    printf("The first value using seed %" PRIu64 " is %" PRIu64 ".\n",
           seed, value);

    return EXIT_SUCCESS;
}

因为我使用GCC,我将上面保存为example.c,将两个文件放在同一目录中,然后使用

编译它们
gcc -Wall -O2 -c tinymt64.c
gcc -Wall -O2 -c example.c
gcc -Wall -O2 example.o tinymt64.o -o example

所以我可以使用

运行它
./example

代码是标准C,应该在TinyMT64编译的所有系统上编译,包括在Windows上。

让我们看一下代码。

首先,tinymt64_init()获取指向tinymt64_tuint64_t种子的指针。第一个用作生成器的状态,第二个用作种子值(用于初始化状态)。因为状态是一个小结构(struct TINYMT64_T,稍后在头文件中键入tinymt64_t),并且没有灵活的数组成员,我们只能将状态声明为普通变量{{ 1}}。然后指向状态的指针为tinymt64_t prng;。该函数不返回任何内容。

其次,&prng只接受指向生成器状态的指针,并将伪随机数作为tinymt64_generate_uint64()返回。

最后,uint64_t宏在UINT64_C()(或inttypes.h)中定义,并允许您定义从stdint.h到{{1}的无符号64位整数在没有猜测特定编译器可能需要的类型后缀(无,0或可能18446744073709551615)的情况下。 (如果常数小于2 31 = UL,则不需要宏,但不会有任何损害。)

ULL宏在2147483648中定义,并定义转换模式(前导PRIu64和可选大小字段除外)inttypes.h系列函数需要打印正确地%

如果你想从中读取种子,例如命令行,你可以使用例如。

printf()

,如果指定了第一个命令行参数,则使用第一个命令行参数,否则使用默认常量种子(uint64_t)。